dbcp连接池在数据库异常恢复后不能正常工作问题解决,dbcp,dbcp的连接池在数据库
分享于 点击 14840 次 点评:245
dbcp连接池在数据库异常恢复后不能正常工作问题解决,dbcp,dbcp的连接池在数据库
dbcp的连接池在数据库出现网络问题,或者数据库服务器down机时会出现异常,这里出异常是正常的,但是在数据库恢复正常之后还是不能正常工作。
一直提示:
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1134) at org.apache.commons.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:79) at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) ... 3 more
这是因为在数据库出问题时,连接池里的活动连接对象占满了连接池,可以看连接池的dataSource.getNumActive()
此值的值和连接池的最大活动连接数一致。 而这些活动连接都是错误的。
我们可以通过下面的配置:
validationQuery="select 1 as dbcp_connection_test"testOnBorrow=true
来修复此问题, validationQuery指定一个检测连接是否有效的sql语句, testOnBorrow=true指定在从连接池中拿连接时,要检查连接是否有效,若无效会将连接从连接池中移除掉。
更多dbcp配置,请参考官网。
用户点评