对于线上应用,我们通常将数据库连接交给容器,比如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的最后一个参数即可。