对于线上应用,我们通常将数据库连接交给容器,比如tomcat容器,那么开发者只需要通过JNDI的方式获取dataSource即可,不需要再关注数据库地址、密码等敏感信息,这样我们就可以简单做到配置隔离。
1)在tomcat的context.xml中增加如下配置:
<Resource name="jdbc/localDB"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
description="JNID MySQL database."
url="jdbc:mysql://localhost:3306/test?socketTimeout=30000&charsetEncoding=utf-8"
maxTotal="256"
maxIdle="10"
removeAbandoned="true"
validationQuery="SELECT 1"
maxWaitMillis="30000"
removeAbandonedTimeout="300"
testOnBorrow="true"
testOnReturn="true"
defaultAutoCommit="true" />
2)增加jar
因为tomcat下或许没有相关的JDBC Connector的jar,比如mysql,此时我们需要将mysql Driver的jar复制到tomcat的lib目录下。
3)在spring中使用JNDI引用方式:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/localDB</value>
</property>
</bean>
对于tomcat容器而言,我们倾向于使用tomcat-jdbc-pool,官方宣称性能相对于其他pool而言更加优秀,而且它与dbcp的参数配置几乎一样,非常便于配置。不过我们可能需要将jdbc链接jar也copy到tomcat的lib目录下,否则将无法启动。
对于jdbc的url中配置,需要注意,需要将";"使用“&”转义,否则将无法正常启动;我也遇到了一个非常奇怪的错误“The reference to entity "characterEncoding" must end with the ';' delimiter”,这个错误的解决办法就是“characterEncoding=UTF-8”参数作为url的最后一个参数即可。