在 Tomcat 中使用 DBCP 数据库连接池,该连接池的 jar 文件为 commons-pool.jar 和 commons-dbcp.jar ,位于 $CATALINA_HOME/common/lib 下。
配置如下:
1. 在 server.xml 中的 context 或 defaultContext 中定义 <Resource> 和 <ResourcParams> 元素,这两个元素一一对应,并且可以定义多对。
2. 在 web.xml 中定义 <resource-ref> ,与上面已定义的 Resource 相对应。
3. 在代码中使用 JNDI 调用查找 JDBC 资源。
下面就来解释这 3 步所作的工作。
1) <Resource> 标签用于定义 DBCP 数据源的 JNDI 资源,定义的形式如下:
<Resource name=”jdbc/TestDB” auth=”Container” type=”javax.sql.DataSource”/>
它包括三个属性:
l name: 指定 Resource 的 JNDI 名字;声明的 JNDI 名是相对于 java:comp/env 上下文的,因此 JNDI 名为 java:comp/env/jdbc/TestDB.
l auth :指定管理 Resource 的 Manager 。它有两个可选值: Container 、 Application 。 Container 表示容器内的资源, Application 表示应用的资源。
l type :指定 Resource 所属的 Java 类名。选项包括 javax.sql.DataSource( 仅限于本地事务 ) 、 javax.sql.XADataSource( 全局事务 ) 和 java.sql.ConnectionPoolDataSource( 本地事务,性能可能会提高 ) 。
2) <ResourceParams> 标签用于配置数据源工厂的参数,定义的形式如下:
<ResourceParams name=”jdbc/TestDB”>
<parameter>
<name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:mysql://localhost:3306/demo </value>
</parameter>
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value>root </value>
</parameter>
<parameter>
<name>maxActive</name> // 最大连接数据库的连接数,设为 0 表示没有限制。
<value>20 </value>
</parameter>
<parameter>
<name>maxIdle</name> // 最大等待连接中的数量,设为 0 表示没有限制。
<value>30000</value>
</parameter>
<parameter>
<name>maxWait</name> // 最大等待的秒数 (ms) ,超过时间会丢出错误信息。
<value>1000</value>
</parameter>
这里参数也可以通过直接写在 <resource> 元素属性中来设置。
3) 在 web.xml 中,配置 <resource-ref> 元素以在 web 应用中引用 JNDI 资源。
< resource-ref >
< description > DB Connection </ description >
< res-ref-name > jdbc/hibtest </ res-ref-name >
< res-type > javax.sql.DataSource </ res-type >
< res-auth > Container </ res-auth >
</ resource-ref >
description :对所用的资源的说明。
res-ref-name :指定所引用资源的 JNDI 名字,与 <Resource> 元素中的 name 属性对应。
res-type :指定所引用资源的类名,与 <Resource> 元素的 type 属性对应。
res-auth: 指定所引用资源的 manager ,与 <resource> 元素中的 auth 属性对应。
4) 在 Web 应用中使用数据源。
Javax.naming.Context 提供查找 JNDI Resource 的接口,可以通过 3 个步骤来使用数据源对象:
l 获得数据源的引用:
Context ctx=new InitialContext();
DataSource ds=(DataSource)ctx.lookup(“java:comp/env/jdbc/TestDB”);
l 获得数据库连接对象:
Connection conn=ds.getConnection();
l 返回数据库连接到连接池:
conn.close();
在连接池中使用 close() 方法跟非连接池中使用 close() 方法的区别是: 前者仅仅把数据库连接对象返回到数据库连接池中,使连接对象又恢复到空闲状态,而非关闭数据库连接,后者将直接关闭与数据库的连接。