dbutils 的连接释放问题

小沈QQ 发布于 2013/08/22 17:20
阅读 1K+
收藏 0

这几天我看到oschina下DbUtils的讨论挺多的,自己写下了个学习一下

有几点小结:

QueryRunner 下的方法不是每个方法都设成关闭连接的(不知道是怎么考虑的,红署看看)

例如:

    public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params) throws SQLException {
        return this.<T>query(conn, false, sql, rsh, params);
    }

我的调用:_g_runner.query(QueryHelper.getConnection(), sql, new BeanListHandler<mobilenum>(Test.vo.mobilenum.class));

我执行这个方法8次,结果如下

2013-08-22 17:04:03 [DBManager geCountStatus 208]-[INFO] connect to DB successful...{当前活动连接[1]最大连接[20]}已释放连接[0]}
2013-08-22 17:04:03 [DBManager$_DebugConnection invoke 250]-[INFO] [SQL] >>> select * from mobilenum
2013-08-22 17:04:03 [DBManager geCountStatus 208]-[INFO] connect to DB successful...{当前活动连接[2]最大连接[20]}已释放连接[0]}
2013-08-22 17:04:03 [DBManager$_DebugConnection invoke 250]-[INFO] [SQL] >>> select * from mobilenum
2013-08-22 17:04:03 [DBManager geCountStatus 208]-[INFO] connect to DB successful...{当前活动连接[3]最大连接[20]}已释放连接[0]}
2013-08-22 17:04:03 [DBManager$_DebugConnection invoke 250]-[INFO] [SQL] >>> select * from mobilenum
2013-08-22 17:04:03 [DBManager geCountStatus 208]-[INFO] connect to DB successful...{当前活动连接[4]最大连接[20]}已释放连接[0]}
2013-08-22 17:04:03 [DBManager$_DebugConnection invoke 250]-[INFO] [SQL] >>> select * from mobilenum
2013-08-22 17:04:03 [DBManager geCountStatus 208]-[INFO] connect to DB successful...{当前活动连接[5]最大连接[20]}已释放连接[0]}
2013-08-22 17:04:03 [DBManager$_DebugConnection invoke 250]-[INFO] [SQL] >>> select * from mobilenum
2013-08-22 17:04:03 [DBManager geCountStatus 208]-[INFO] connect to DB successful...{当前活动连接[6]最大连接[20]}已释放连接[0]}
2013-08-22 17:04:03 [DBManager$_DebugConnection invoke 250]-[INFO] [SQL] >>> select * from mobilenum
2013-08-22 17:04:03 [DBManager geCountStatus 208]-[INFO] connect to DB successful...{当前活动连接[7]最大连接[20]}已释放连接[0]}
2013-08-22 17:04:04 [DBManager$_DebugConnection invoke 250]-[INFO] [SQL] >>> select * from mobilenum
2013-08-22 17:04:04 [DBManager geCountStatus 208]-[INFO] connect to DB successful...{当前活动连接[8]最大连接[20]}已释放连接[0]}

 

连接池还剩下12个,做了8次,8次都没close掉。无语。

说明一下这个帮连接池没关系,代码不用连接池也一样的。

将false改成true肯定是行的,不知道为什么要这么设计,像坑人一样的。

 

红署哥的DBManager我也看了,用了数据源,应该是为了调用时线程安全。

/**
  * 关闭连接
  */
 public final static void closeConnection() {
  Connection conn = conns.get();
  try {
   if(conn != null && !conn.isClosed()){
    conn.setAutoCommit(true);
    conn.close();
   }
  } catch (SQLException e) {
   log.error("Unabled to close connection!!! ", e);
  }
  conns.set(null);
 }

这块我一直不解,用了ThreadLocal,用完将后remove掉,这块好理解,为什么还要再conn.close();
源码已有释放的代码了,虽然我不理解为什么有的close,有的没有close.这个要高手给个说明一下,小沈坐等解释。:)

 

说明一下我用的是proxool连接池,用的也是数据源 ProxoolDataSource

红薯哥,看到求回复啊。虽然我有些时间没上oschina了,哈…………

 

 

加载中
0
小沈QQ
小沈QQ

自已顶顶,没人理啊

0
小沈QQ
小沈QQ
顶起!!!!!!!!!!!!!!!!!!!!!
0
loyal
loyal

哎,osc的连接关闭是在filter中统一关闭的.确切的说是放回连接池.


返回顶部
顶部