DbUtils使用时抛出Cannot get a connection

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的拆除条件是什么?为什么?有时间要搞明白。

原文地址:https://www.cnblogs.com/yoyotl/p/5316190.html