java中用try-with-resources管理jdbc资源时,connection、statement、resultset必须同在try括号内声明以实现自动关闭;关闭顺序为逆序(resultset→statement→connection),符合依赖关系;datasource获取的连接同样适用,且禁止嵌套try或外部声明内部资源。

Java 中用 try-with-resources 管理 Connection,核心是让 Connection(以及 Statement、ResultSet)实现 AutoCloseable 接口——JDBC 4.0+ 的驱动都满足这点,所以可以直接在 try 括号里声明并自动关闭。
Connection 必须在 try-with-resources 中声明
不能先声明再赋值,否则无法自动关闭。正确写法是直接在 try 括号内获取连接:
try (Connection conn = DriverManager.getConnection(url, user, pwd);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users")) {
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}这样,无论执行是否异常,rs → stmt → conn 都会按逆序自动调用 close()。
多个资源按声明顺序反向关闭
资源关闭顺序由声明先后决定:后声明的先关闭。比如上面例子中:
-
ResultSet最先关闭(依赖Statement) -
Statement其次(依赖Connection) -
Connection最后关闭
这个顺序符合 JDBC 资源依赖关系,避免了“连接已关闭却还要关 Statement”的异常。
使用 DataSource 时同样适用
生产环境推荐用 DataSource(如 HikariCP、Druid),它返回的 Connection 也实现了 AutoCloseable:
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM users WHERE id = ?");
ResultSet rs = ps.executeQuery()) {
ps.setLong(1, 1001);
// 处理结果...
}注意:PreparedStatement 和 ResultSet 也要放在同一 try 括号中,否则手动 close 容易遗漏或重复。
不支持嵌套 try-with-resources 的常见误区
不要把 Connection 放在外部 try,再在内部开 Statement/ResultSet —— 这样内部资源不会被自动管理:
// ❌ 错误:stmt 和 rs 不会被自动关闭
try (Connection conn = dataSource.getConnection()) {
try (PreparedStatement ps = conn.prepareStatement(...)) { // ✅ 这个可以
// 但 rs 如果没写在这里,就可能漏关
}
}推荐所有 JDBC 资源都在同一个 try 括号中声明,清晰且安全。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











