【发布时间】:2011-07-07 09:50:03
【问题描述】:
我正在审查一大堆现有代码,试图找到可能导致连接池耗尽或抛出其他错误的未关闭连接。
在某些地方我看到连接返回到池中,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
【问题讨论】:
标签: java mysql jdbc connection-pooling