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的配置:
1 <property name="initialSize" value="1" /> 2 <property name="maxTotal" value="10" /> 3 <property name="maxIdle" value="3" /> 4 <property name="minIdle" value="0" /> 5 <property name="maxWaitMillis" value="3000" />
结果是确认了,程序建立的连接达到maxTotal的限制,而且都是活动的链接,所以第11条连接是创建不出来了,等待的时间超过3000ms,抛出。
三、需要手动的释放的数据库的链接?
我的代码如下:
1 public int queryCount(DataSource ds,String sql){ 2 queryRunner = new QueryRunner(ds); 3 try{ 4 return ((Long)queryRunner.query(ds.getConnection(), sql, new ScalarHandler())).intValue(); 5 }catch(SQLException e){ 6 logger.error("Error occured while attempting to update data", e); 7 } 8 return ConstantCc.FAILED; 9 }
忽然发现,手动的获取链接有些多余,改动如下:
1 public int queryCount(DataSource ds,String sql){ 2 queryRunner = new QueryRunner(ds); 3 try{ 4 return ((Long)queryRunner.query(sql, new ScalarHandler())).intValue(); 5 }catch(SQLException e){ 6 logger.error("Error occured while attempting to update data", e); 7 } 8 return ConstantCc.FAILED; 9 }
再测试,就不会建立很多个链接了,每次只有一个链接。
四、新的问题,每次数据库操作都会重新建立一个链接,然后保持这条链接,直到下次请求。
第一次数据库操作: 1.建立一条链路A; 2.A保持链接; 第二次数据库操作: 1.拆除链路A; 2.建立一条链路B; 3.B保持链接; 第三次数据库操作: 1.拆除链路B; 2.建立一条链路C; 3.C保持链接;
这个是合理的吗?A的拆除条件是什么?为什么?有时间要搞明白。