java中try-with-resources可自动关闭autocloseable资源,需在try括号内直接声明初始化,否则不生效;多资源按逆序关闭,即resultset→statement→connection,确保依赖关系正确。

Java 中 try-with-resources 可以自动管理 Statement(以及 Connection、ResultSet)这类实现了 AutoCloseable 接口的数据库资源,避免手动调用 close(),防止资源泄漏。
Statement 必须在 try-with-resources 中声明
只有在 try 括号内直接声明并初始化的资源,才能被自动关闭。不能先声明变量再赋值,否则编译不通过。
✅ 正确写法:
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM user")) {
while (rs.next()) {
System.out.println(rs.getString("name"));
}
} // 自动按 rs → stmt → conn 顺序关闭
❌ 错误写法(编译失败):
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
Statement stmt;
try {
stmt = conn.createStatement(); // 不在 try() 中声明 → 不受管理
...
}
// stmt 不会自动关闭
多个资源按声明逆序关闭
try-with-resources 中资源关闭顺序是“后声明先关闭”,这符合数据库资源依赖关系:ResultSet 依赖 Statement,Statement 依赖 Connection,所以关闭顺序为:ResultSet → Statement → Connection。
- 即使某个资源关闭时抛出异常,后续资源仍会继续尝试关闭
- Throwable.getSuppressed() 获取)
注意 PreparedStatement 和 CallableStatement 同样适用
PreparedStatement 和 CallableStatement 都继承自 Statement,也实现了 AutoCloseable,可直接用于 try-with-resources。
示例(带参数的预编译语句):
try (Connection conn = dataSource.getConnection();
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO user(name) VALUES (?)")) {
pstmt.setString(1, "Alice");
pstmt.executeUpdate();
} // pstmt 和 conn 均自动关闭
不要在 try-with-resources 外部复用 Statement
Statement 是有状态的一次性资源,关闭后不可再用。若在 try 块外保存引用并试图重用,会抛出 SQLException: Statement closed。
- 每次数据库操作应新建独立的 Statement(或复用连接池中的连接,但 Statement 通常不复用)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










