zoukankan      html  css  js  c++  java
  • 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的拆除条件是什么?为什么?有时间要搞明白。

  • 相关阅读:
    分布式缓存技术redis学习系列(一)——redis简介以及linux上的安装
    redis整合spring(redisTemplate工具类)
    架构之路之spring+redis的集成
    java之redis篇(spring-data-redis整合)
    Redis 安装
    java对redis的基本操作
    mybatis 详解(九)------ 一级缓存、二级缓存
    mybatis 详解(八)------ 懒加载
    mybatis 详解(七)------一对一、一对多、多对多
    mybatis 详解(六)------通过mapper接口加载映射文件
  • 原文地址:https://www.cnblogs.com/yoyotl/p/5316190.html
Copyright © 2011-2022 走看看