问题描述: 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的总和应小于 数据库设置的 超时空闲失效时间。