工作小总结

使用dbcp作为数据池的坑

客户端: 使用sqlyog或者是navicat执行操作。等一会不操作,下次操作第一次就会比较卡。需要等待,才可以。连接上,继续操作没问题。但是一会不操作,下次操作,又会复现。应用程序: 使用java程序连接,现象和客户端很类似。第一次连接,需要等待。之后就正常了。数据库都是用默认配置的:这种情况怎么解决?先说解决使用应用程序连接时候:错误描述:http://img.kaigej

客户端:

 使用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自动重连的配置

Xml代码  收藏代码

  1. <Resource  

  2. name="jdbc/TestDB"  JNDI数据源的name,查找时用:java:comp/env/jdbc/TestDB  

  3. type="javax.sql.DataSource"  

  4. factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"  

  5. driverClassName="com.mysql.jdbc.Driver" JDBC驱动类  

  6. url="jdbc:mysql://localhost:3306/test?  

  7. characterEncoding=UTF-8&amp;autoReconnectForPools=true&amp;rewriteBatchedStatements=true&amp;useCursorFetch=true&amp;defaultFetchSize=20" 数据库URL地址    

  8. username="xxx" 访问数据库用户名  

  9. password="xxx" 访问数据库的密码  

  10.    

  11. maxWait="3000" 从池中取连接的最大等待时间,单位ms.  

  12. initialSize="10"  初始化连接  

  13. maxIdle="60"   最大空闲连接  

  14. minIdle="10"   最小空闲连接  

  15. maxActive="80" 最大活动连接  

  16.    

  17. validationQuery = "SELECT 1"  验证使用的SQL语句  

  18. testWhileIdle = "true"      指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.  

  19. testOnBorrow = "false"   借出连接时不要测试,否则很影响性能  

  20. timeBetweenEvictionRunsMillis = "30000"  每30秒运行一次空闲连接回收器  

  21. minEvictableIdleTimeMillis = "1800000"  池中的连接空闲30分钟后被回收  

  22. numTestsPerEvictionRun="10" 在每次空闲连接回收器线程(如果有)运行时检查的连接数量  

  23.       

  24. removeAbandoned="true"  连接泄漏回收参数,当可用连接数少于3个时才执行  

  25. removeAbandonedTimeout="180"  连接泄漏回收参数,180秒,泄露的连接可以被删除的超时值  

  26. />  

 

 

DBCP连接池的自我检测

-----------------------------

默认配置的DBCP连接池,是不对池中的连接做测试的,有时连接已断开了,但DBCP连接池不知道,还以为连接是好的呢。

应用从池中取出这样的连接访问数据库一定会报错。这也是好多人不喜欢DBCP的原因。

 

问题例一:

MySQL8小时问题,Mysql服务器默认连接的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。

但是DBCP连接池并不知道连接已经断开了,如果程序正巧使用到这个已经断开的连接,程序就会报错误。

 

问题例二:

    以前还使用Sybase数据库,由于某种原因,数据库死了后重启、或断网后恢复。

    等了约10分钟后,DBCP连接池中的连接还都是不能使用的(断

原创不易,完成人机校验,阅读全文

相关推荐