java - MySQL 和 JDBC 连接池 : unclosed statements

标签 java mysql jdbc connection-pooling

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

在某些地方我看到连接返回到池中,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/

相关文章:

java - 为什么 Eclipse 控制台不显示日志范围结果

Java Rmi stub 对象生命周期

java - 将新数据追加到 ArrayList 的简单方法

mysql - 像 mysql 一样将大型 csv 加载到 RDB 的推荐方法

java - 无法使用 JDBC 连接到 mySql docker 容器

Java数据库大数据量查询/更新

java - JSP 文件无法识别 ArrayList?

mysql - 在 mysql 中使用独占或

mysql - SQL 数据库 (Django) - 将表 B 中的所有记录与表 A 中的每条记录相关联

r - src_snowflakedb() 问题 : 'src_sql' is not an exported object