gpt4 book ai didi

java - MySQL 和 JDBC 连接池 : unclosed statements

转载 作者:行者123 更新时间:2023-11-29 02:35:53 25 4
gpt4 key购买 nike

我正在审查一大堆现有代码,试图找到会导致连接池耗尽或抛出其他错误的未关闭连接。

在某些地方我看到连接返回到池中,ResultSet 关闭,但 PreparedStatement 没有关闭。

在伪代码中它看起来像这样:

Connection conn = null;
try {
conn = MyJdbcTemplateHolder.getNewConnectionFromPool();
PreparedStatement ps = conn.prepareStatement(sql, ...);
ResultSet rs = st.executeQuery();

// do stuff with results

} catch(Exception e) {
// exception
} finally {
rs.close();
MyJdbcTemplateHolder.returnConnectionToPool(conn);
//***** Here is what's missing: st.close(); *****
}

问题是:open 语句是否会因为未明确关闭而导致问题?还是关闭 ResultSet 并返回连接就足够了?

显然,我不是在谈论一个公开声明 - 我们有一个包含 100 个连接的池,代码中的许多地方可能会出现此问题。

  • MySQL版本为5.1
  • 我的 JDBC jar 是 mysql-connector-java-5.1.11-bin.jar

最佳答案

答案是是的,它会导致问题。正如 SO 中所讨论的那样:

如果您在完成处理后(或在 finally block 中)没有以相反的顺序关闭与连接相关的资源,您就会面临风险。连接池处理它们的方式各不相同,但令人担忧的是 - 至少 - 一组不正确关闭的资源被扔回池中。

如果不清楚(您可能已经知道这一点),请在此处进一步讨论正确关闭资源:

请注意,在即将发布的 Java 7 中,这里会有一些帮助:

http://www.javaspecialists.eu/archive/Issue190.html

其中在 Java 中引入了一个新的 try-with-resources 语句,它会自动关闭 try 语句中引用的任何 AutoCloseable 资源。

关于java - MySQL 和 JDBC 连接池 : unclosed statements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5170156/

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