java.sql.SQLException: Cannot get a connection, pool error Timeout waiting for idle object
Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
根据字面很容易理解,获取链接超时。
一、查看当前数据库的连接情况:
登录Mysql后台,执行命令:show full processlist;
发现我的程序建立了10个链接。
进一步测试,每发送一次数据库请求,就建立一个新的链接。
二、查看我的Dbcp2的配置:
<property name="initialSize" value="1" />
<property name="maxTotal" value="10" />
<property name="maxIdle" value="3" />
<property name="minIdle" value="0" />
<property name="maxWaitMillis" value="3000" />
结果是确认了,程序建立的连接达到maxTotal的限制,而且都是活动的链接,所以第11条连接是创建不出来了,等待的时间超过3000ms,抛出。
三、需要手动的释放的数据库的链接?
我的代码如下:
public int queryCount(DataSource ds,String sql){
queryRunner = new QueryRunner(ds);
try{
return ((Long)queryRunner.query(ds.getConnection(), sql, new ScalarHandler())).intValue();
}catch(SQLException e){
logger.error("Error occured while attempting to update data", e);
}
return ConstantCc.FAILED;
}
忽然发现,手动的获取链接有些多余,改动如下:
public int queryCount(DataSource ds,String sql){
queryRunner = new QueryRunner(ds);
try{
return ((Long)queryRunner.query(sql, new ScalarHandler())).intValue();
}catch(SQLException e){
logger.error("Error occured while attempting to update data", e);
}
return ConstantCc.FAILED;
}
再测试,就不会建立很多个链接了,每次只有一个链接。
四、新的问题,每次数据库操作都会重新建立一个链接,然后保持这条链接,直到下次请求。
第一次数据库操作:
1.建立一条链路A;
2.A保持链接;
第二次数据库操作:
1.拆除链路A;
2.建立一条链路B;
3.B保持链接;
第三次数据库操作:
1.拆除链路B;
2.建立一条链路C;
3.C保持链接;
这个是合理的吗?A的拆除条件是什么?为什么?有时间要搞明白。