cms
当前位置:首页->常见问题
关于tomcat自带连接池dbcp的优化设置
  • 作者:本站
  • 日期:2016-02-29
  • 出处:totcms
  • 点击:7534

一个网站每天大概有20万的访问量,使用的tomcat自带dbcp连接池,一般网站访问很好,速度也很快,但是过一段时间后,总是报timeout waiting for idle object的异常信息,查了apache tomcat的官方文档,终于找到解决方法:

数据库连接池创建和管理池中的数据库连接对象。重建和复用已存在的连接对象要比创建新的连接要频繁的多。

连接池会存在这样一个问题。web应用已经明确关闭ResultSet,Statement,及Connection对象;当关闭出现故障的web应用所使用的资源
时将会导致这个连接资源不能在复用,这就是数据库连接池泄露,导致在你的应用程序中没有连接对象可以使用。


这当然是有解决方法的,Apache Commons DBCP可以配置为跟踪和恢复这些被弃的数据库连接对象。不仅恢复还可以跟踪那些连接数据库却没有关闭的代码片段。


要增加连接池中被弃的连接重新可用,打开配置文件,为Resource标签配置以下参数:

removeAbandonedOnBorrow=true
removeAbandonedOnMaintenance=true
removeAbandonedTimeout="60"
logAbandoned="true"

默认情况下removeAbandonedOnBorrow和removeAbandonedOnMaintenance都是为false。

注意:removeAbandonedOnMaintenance只有在timeBetweenEvictionRunsMillis设置为正数的情况下才有效。

removeAbandonedTimeout属性是设置数据库连接被释空闲时间多少秒之后设置为空闲。默认移除废弃连接的时间为300秒。

提示:

如果启用removeAbandonedOnMaintenance 或 removeAbandonedOnBorrow,那些被认为废弃的连接对象有可能被池回收。这个机制以下情况下会触发:
当getNumIdle() < 2并且getNumActive() > getMaxTotal() - 3及emoveAbandonedOnBorrow 设置为true时;或 当removeAbandonedOnMaintenance设置为true并且回收完成时。
打个比方说:
如果设置maxTotal=20,当有18个活跃连接、1个空闲连接时会触发removeAbandonedOnBorrow,不过仅是那些使用时间超过removeAbandonedTimeout秒数的活动连接才会被移除(默认是300秒)
,遍历resultset不作为正在使用。创建Statement,PrepareStatement或CallableStatement或使用其中一个执行查询(执行exceute方法)重置父连接的lastUsed属性。


DBCP连接池配置参数讲解

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

一、Apache官方DBCP文档给出的配置示例:

可参见:http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html


 

               maxActive="100" maxIdle="30" maxWait="10000"

               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"

               url="jdbc:mysql://localhost:3306/javatest"/>