问题描述:

mysql dba在mysql服务端启用了连接在空闲一定时间(10分钟) 后,就自动关闭连接(连接失效)的功能,导致java端连接池在空闲一段时间后,连接被自动关闭(自动失效)。为了避免这种情况出现,可以在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



minEvictableIdleTimeMillis (空闲逐出 连接池的时间,单位:毫秒,默认30分钟)



numTestsPerEvictionRun (设定在进行后台对象清理时,每次检查几个链接。默认值是3.



如果numTestsPerEvictionRun>=0, 则取numTestsPerEvictionRun 和池内的链接数 的较小值 作为每次检测的链接数



如果numTestsPerEvictionRun<0,则每次检查的链接数是检查时池内链接的总数乘以这个值的负倒数再向上取整的结果。)
举例:
              XX系统的数据库Mysql,dba设置的超时空闲失效时间是600秒(MYSQL如果不设置,默认的是8小时),未加以下参数之前经常报链接失效的错误,加上以下配置后,暂时未发现有错。timeBetweenEvictionRunsMillis="290000" minEvictableIdleTimeMillis="290000" numTestsPerEvictionRun="20"
              注: timeBetweenEvictionRunsMillis和minEvictableIdleTimeMillis的总和应小于 数据库设置的 超时空闲失效时间。