druid数据源无可用连接问题
背景
在工程中使用了druid连接池,运行一段时间后系统出现异常,但是使用客户端能正常连接,连接数被未被占满,报错如下:
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60009, active 50 at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:280) … 64 more
原因及解决方案
应该是程序中有地方连接未关闭造成的。那如何来定呢?使用druid连接池的超时回收机制,在配置中增加以下内容:
<!– 超过时间限制是否回收 –>
<property name=“removeAbandoned” value=“true” />
<!– 超时时间;单位为秒。180秒=3分钟 –>
<property name=“removeAbandonedTimeout” value=“180” />
<!– 关闭abanded连接时输出错误日志 –>
<property name=“logAbandoned” value=“true” />
但是加了logAbandoned配置之后,可能经常会强制释放连接报错,错误如下:
[com.alibaba.druid.pool.DruidDataSource] – <abandon connection, open stackTrace at java.lang.Thread.getStackTrace(Thread.java:1567) at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:995) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4544)
备注:该堆栈是之前使用该连接是new出来的,故可以凭此确认此链接使用没有很好的回收。
但理论上使用了mybatis,mybatis会负责好连接池申请回放回