一.为什么要用数据库链接池?
当多个用户访问网站,并且长时间使用,那么其他访问者由于得不到链接而被堵。数据库服务器对于大量的链接请求也很难吃得消。
为了实现“随开随关”的原则,并且避免大量创建Connection对象的现象(创建一个Connection对象,数据库大概可以完成8到10次 甚至更多的数据库检索),我们用到了数据库链接池。
数据库连接池的原理:为服务器(如Tomcat)配置一个连接池,配置文件中指定所要链接的服务器和链接个数,这样服务器启动的时候,首先会连接目标数据库创建指定个数的活动链接,并将其放到连接池中。
二、链接池的配置
1.在tomcat中配置数据库链接池
DBCP使用的是Jakarta-Commons Database Connection Pool 要使用连接池需要如下的组件即jar文件。
l Jakarta-Commons DBCP 1.1 对应commons-dbcp-1.1.jar。
l Jakarta-Commons Collections 2.0 对应commons-collections.jar。
l Jakarta-Commons Pool 1.1 对应commons-pool-1.1.jar。
这三个jar文件要与你的JDBC驱动程序一起放到【TOMCAT_HOME】\common\lib目录下以便让tomcat和你的web应用都能够找到。
注:
l 这三个jar文件是默认存在与【TOMCAT_HOME】\common\lib下的。
l 需要注意的地方:第三方的驱动程序或者其他类只能以*.jar的形式放到Tomcat的common\lib目录中,因为Tomcat只把*.jar文件加到CLASSPATH中。
l 不要把上诉三个文件放到WEB-INF/lib或者其他地方因为这样会引起混淆。
(2)通过配置阻止连接池漏洞
数据库连接池创建和管理连接池中建立好的数据库连接,循环使用这些连接以得到更好的效率。这样比始终为一个用户保持一个连接和为用户的请求频繁的建立和销毁数据库连接要高效的多。
这样就有一个问题出现了,一个Web应用程序必须显示的释放ResultSet,Statement和Connection。如果在关闭这些资源的过程中失败将导致这些资源永远不在可用,这就是所谓的连接池漏洞。这个漏洞最终会导致连接池中所有的连接不可用。
通过配置Jakarta Common DBCP可以跟踪和恢复那些被遗弃的数据库连接。
以下是一系列相关配置:
l 通过配置DBCP数据源中的参数removeAbandoned来保证删除被遗弃的连接使其可以被重新利用。
为ResourceParams(见下文的数据源配置)标签添加参数removeAbandoned
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
通过这样配置的以后当连接池中的有效连接接近用完时DBCP将试图恢复和重用被遗弃的连接。这个参数的值默认是false。
l 通过设置removeAbandonedTimeout来设置被遗弃的连接的超时的时间,即当一个连接连接被遗弃的时间超过设置的时间时那么它会自动转换成可利用的连接。
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>
默认的超时时间是300秒。
l 设置logAbandoned参数,以将被遗弃的数据库连接的回收记入日志中
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
这个参数默认为false。
2.修改server.xml文件
在最后的</Host>标记之前添加如:
<Context docBase="Epai-0.1" path="/Epai-0.1" reloadable="true" source="org.eclipse.jst.j2ee.server:Epai-0.1"> <Resource name="jdbc/epai" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="plh" driverClassName="org.gjt.mm.mysql.Driver" url="jdbc:mysql://localhost:3306/epai"> </Resource> <ResourceParams name="jdbc/epai"> <name>factory</name> <value> org.apache.commons.dbcp.BasicDataSourceFactory </value> <parameter> <name>removeAbandoned</name> <!-- 回收被遗弃的(一般是忘了释放的)数据库连接到连接池中。 Abandoned DB connections are removed and recycled --> <value>true</value> </parameter> <parameter> <name>removeAbandonedTimeout</name> <!-- 数据库连接过多长时间不用将被视为被遗弃而收回连接池中。 Use the removeAbandonedTimeout parameter to set the number of seconds a DB connection has been idle before it is considered abandoned. --> <value>60</value> </parameter> <parameter> <name>logAbandoned</name> <!-- 将被遗弃的数据库连接的回收记入日志。 Log a stack trace of the code which abandoned --> <value>false</value> </parameter> </ResourceParams>
其中 Context里的内容是项目要发布需要的内容
jdbc/epai epai是资源名,要放在jdbc子文件中,这样形成一个完整的逻辑名,与DataSource对象关联起来
maxActive="100" maxIdle="30" maxWait="10000" 指连接池最大连接数是100,理想连接数是30,最大等待时间是10秒
3.在本应用下的WEB-INF目录下web.xml中添加如下配置
<resource-ref>
<description>DB Connection</description><!-- 资源描述 -->
<res-ref-name>jdbc/epai</res-ref-name><!-- 资源JNDI名称 -->
<res-type>javax.sql.DataSource</res-type><!-- 资源类型 -->
<res-auth>Container</res-auth>
</resource-ref>
4.使用链接池得到链接
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
Context initial=(Context) new InitialContext();//创建初始上下文
DataSource ds=(DataSource)initial.looku("java:comp/env/jdbc/epai");
Connection conn=(Connection) ds.getConnection();
值得注意的是:要及时关闭链接。能在任何情况下都关链接用finally
如
try{
....
}catch(Exception e){
.....
}
finally{
try{
conn.close();//关闭链接
}catch(Exception e){
}
}
这样就能把链接池建好了
三、建链接池时出现的错误
1、错误显示“Cannot load JDBC driver class 'org.git.mm.mysql.Driver”
这个问题是要么没加驱动,要么驱动名写错了。我做的时候把驱动类写错了,把“gjt”写成了这“git”。
2、错误显示"Cannot create JDBC driver of class '' for connect URL 'null"
Tomcat先找到web.xml下的<resource-ref>,然后再找server.xml下面的<Resource>。如果没有找到<Resource name=”JDBC/TestDB”>,或者名字错了,则会报“Cannot create JDBC driver of class '' for connect URL 'null'”错误
附件里有Jakarta-Commons Database Connection Pool 使用的组件
在http://commons.apache.org也可以下
3.Cannot load JDBC driver class 'org.gjt.mm.mysql.Driver'
驱动写对了,还错的话,就是附件里的jar文件没放到tomcat/common/lib下