详解连接池的配置的过程以及可能出现错误的处理方法
一.为什么要用数据库链接池?
?? 当多个用户访问网站,并且长时间使用,那么其他访问者由于得不到链接而被堵。数据库服务器对于大量的链接请求也很难吃得消。
?? 为了实现“随开随关”的原则,并且避免大量创建Connection对象的现象(创建一个Connection对象,数据库大概可以完成8到10次 甚至更多的数据库检索),我们用到了数据库链接池。
?? 数据库连接池的原理:为服务器(如Tomcat)配置一个连接池,配置文件中指定所要链接的服务器和链接个数,这样服务器启动的时候,首先会连接目标数据库创建指定个数的活动链接,并将其放到连接池中。
二、链接池的配置
1.在tomcat中配置数据库链接池
?
<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下