数据库超时空闲失效-dbcp连接池参数优化

原创
2016/03/15 11:11
阅读数 889


问题描述:

          mysql dba在mysql服务端启用了连接在空闲一定时间 (10分钟) 后,就自动关闭连接(连接失效)的功能,导致java端连接池在空闲一段时间后,连接被自动关闭(自动失效)。为了避免这种情况出现,可以在dbcp上配置空闲的时候检测连接池线程功能。

               一些新建的数据库,DBA设置了超时空闲失效时间(即一个连接超过多长时间空闲,该连接将失效),而我们的很多程序使用的是DBCP连接池

默认参数的情况下连接池是不会自动去检测某个连接是否失效的。这样程序如果获到的是已经失效的链接,将会出现报错。


解决原理:
DBCP使用Apache的ObjectPool作为Connection Pool的实现,在构造GenericObjectPool的时候,会生成一个Inner Class Evictor,实现Runnable的接口。如果属性_timeBetweenEvictionRunsMillis > 0,每过_timeBetweenEvictionRunsMillis毫秒后Evictor会调用evict method,检查Object的idle time是否大于属性_minEvictableIdleTimeMillis毫秒(如果_minEvictableIdleTimeMillis设置为<=0则忽略,使用default value 30分钟),如果是则销毁该Object

参数说明
timeBetweenEvictionRunsMillis (设置的Evict线程的时间,单位:毫秒,即每隔多少时间去检测一次空闲连接是否超时,默认值为-1,即不开启)
minEvictableIdleTimeMillis (空闲逐出连接池的时间,单位:毫秒,默认30分钟)
numTestsPerEvictionRun (设定在进行后台对象清理时,每次检查几个链接。默认值是3.
如果numTestsPerEvictionRun>=0, 则取numTestsPerEvictionRun 和池内的链接数 的较小值 作为每次检测的链接数
如果numTestsPerEvictionRun<0,则每次检查的链接数是检查时池内链接的总数乘以这个值的负倒数再向上取整的结果。)
举例:
              XX系统的数据库Mysql,dba设置的超时空闲失效时间是600秒(MYSQL如果不设置,默认的是8小时),未加以下参数之前经常报链接失效的错误,加上以下配置后,暂时未发现有错。timeBetweenEvictionRunsMillis="290000" minEvictableIdleTimeMillis="290000" numTestsPerEvictionRun="20"
              注:timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis的总和应小于 数据库设置的 超时空闲失效时间。

展开阅读全文
打赏
1
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
1
分享
返回顶部
顶部