gpt4 book ai didi

java - 关闭时未释放 Mysql 数据源连接

转载 作者:行者123 更新时间:2023-11-29 02:56:20 26 4
gpt4 key购买 nike

我有一个配置了 100 个连接的 mysql 数据源。看起来即使在如下调用 close() 之后,连接也没有被释放到池中。

   public void test() {
for(1 to 200) {
try {
Connection conn1 = datasource.getConnection();
ResultSet rs = conn1.createStatement().executeQuery(...);
} finally {
DBHelper.close(rs);
}
}
}

//DBHelper.java
public close(ResultSet rs) {
Statement stmt = rs.getStatement();
rs.close();
Connection conn2 = stmt.getConnection();
stmt.close();
conn2.close();
}

在 100 之后,我从 getConnection API 得到一个错误,指出池是空的。如果我执行 conn1.close(),它工作正常。

Failed due to [http-bio-8080-exec-7] Timeout: Pool empty. Unable to fetch a connection in 180 seconds, none available[size:100; busy:100; idle:0; lastwait:180000].

我注意到 conn1 的类型是 com.mysql.jdbc.JDBC4Connection,而 conn2 的类型是 com.sun.proxy.$Proxy5

代码库很大,所以更愿意继续这样做,因为从 API 的角度来看,这种关闭似乎完全没问题。是否仍然可以使用 conn2 关闭连接?

操作系统:ubuntu,Tomcat 7.0.52.0。 Mysql-Connector-J-20-bin.jar.

最佳答案

你需要这样做:

   private doClose(ResultSet rs, Connection con) throws Exception {
if (rs != null) rs.close();

if (con != null) con.close();
}

这需要成为最佳实践:

   public void test() {
for(1 to 200) {
Connection conn1 = null;
ResultSet rs = null;
try {
conn1 = datasource.getConnection();
rs = conn1.createStatement().executeQuery(...);
.
.

}
finally {
if (conn1 != null) conn1.close();
if (rs != null) rs.close();
}
}
}

关于java - 关闭时未释放 Mysql 数据源连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30422671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com