使用dbcp作为数据池的坑
客户端:
使用sqlyog或者是navicat 执行操作。等一会不操作,下次操作第一次就会比较卡。需要等待,才可以。连接上,继续操作没问题。但是一会不操作,下次操作,又会复现。
应用程序:
使用java程序连接,现象和客户端很类似。第一次连接,需要等待。之后就正常了。
数据库都是用默认配置的:
这种情况怎么解决?
先说解决使用应用程序连接时候:
错误描述:
http://img.kaigejava.com/kaigejava/images/1d4159be3bde9b2d10caf99127d3b87b.png
查询dbcp:
DBCP连接池介绍
-----------------------------
目前 DBCP 有两个版本分别是 1.3 和 1.4。
DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 JDBC 3。
DBCP 1.4 版本需要运行于 JDK 1.6 ,支持 JDBC 4。
1.3和1.4基于同一套源代码,含有所有的bug修复和新特性。因此在选择DBCP版本的时候,要看你用的是什么JDK版本。
DBCP1.2版本性能一般,比c3p0差挺多。DBCP1.4和1.3,配合(依赖)commons pool 1.6的jar包,各方面功能、性能推进到新的高峰。相对1.2版本提高不少。超越(或相当)了c3p0.建议使用DBCP1.4或1.3 + commons pool 1.6
Tomcat7 中保留DBCP连接池,以兼容已有应用。并提供了新的Tomcat JDBC pool作为DBCP的可选替代。新出的Tomcat JDBC pool,据说比DBCP 1.4要好,未接触,也不在本文讨论范围内。
DBCP连接池配置参数讲解
-----------------------------
一、Apache官方DBCP文档给出的配置示例:
可参见:http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html
<Context>
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/javatest"/>
</Context>
tomcat JDBC连接池配置示例,自动检查连接的可用性,dbcp定时检测连接,dbcp自动重连的配置
<Resource
name="jdbc/TestDB" JNDI数据源的name,查找时用:java:comp/env/jdbc/TestDB
type="javax.sql.DataSource"
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
driverClassName="com.mysql.jdbc.Driver" JDBC驱动类
url="jdbc:mysql://localhost:3306/test?
characterEncoding=UTF-8&autoReconnectForPools=true&rewriteBatchedStatements=true&useCursorFetch=true&defaultFetchSize=20" 数据库URL地址
username="xxx" 访问数据库用户名
password="xxx" 访问数据库的密码
maxWait="3000" 从池中取连接的最大等待时间,单位ms.
initialSize="10" 初始化连接
maxIdle="60" 最大空闲连接
minIdle="10" 最小空闲连接
maxActive="80" 最大活动连接
validationQuery = "SELECT 1" 验证使用的SQL语句
testWhileIdle = "true" 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.
testOnBorrow = "false" 借出连接时不要测试,否则很影响性能
timeBetweenEvictionRunsMillis = "30000" 每30秒运行一次空闲连接回收器
minEvictableIdleTimeMillis = "1800000" 池中的连接空闲30分钟后被回收
numTestsPerEvictionRun="10" 在每次空闲连接回收器线程(如果有)运行时检查的连接数量
removeAbandoned="true" 连接泄漏回收参数,当可用连接数少于3个时才执行
removeAbandonedTimeout="180" 连接泄漏回收参数,180秒,泄露的连接可以被删除的超时值
/>
DBCP连接池的自我检测
-----------------------------
默认配置的DBCP连接池,是不对池中的连接做测试的,有时连接已断开了,但DBCP连接池不知道,还以为连接是好的呢。
应用从池中取出这样的连接访问数据库一定会报错。这也是好多人不喜欢DBCP的原因。
问题例一:
MySQL8小时问题,Mysql服务器默认连接的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。
但是DBCP连接池并不知道连接已经断开了,如果程序正巧使用到这个已经断开的连接,程序就会报错误。
问题例二:
以前还使用Sybase数据库,由于某种原因,数据库死了后重启、或断网后恢复。
等了约10分钟后,DBCP连接池中的连接还都是不能使用的(断
原创不易,完成人机校验,阅读全文
