必须显式关闭connection、statement、resultset,推荐用try-with-resources自动管理;若手动关闭,须在finally中倒序检查null并捕获close异常;connection不可全局持有或跨线程复用。

Java 中通过 JDBC 释放数据库连接资源,核心原则是:**Connection、Statement、ResultSet 必须显式关闭,且不能依赖 GC 回收**。不关会导致连接数爆满、MySQL 报 Too many connections 或通信中断异常。
必须用 try-with-resources 自动管理
从 JDBC 4.0(Java 6+)起,Connection、Statement、ResultSet 都实现了 AutoCloseable,天然支持 try-with-resources。这是最安全、简洁的方式:
- 资源必须在
try()括号内直接声明并初始化,例如:try (Connection conn = DriverManager.getConnection(url);<br> PreparedStatement ps = conn.prepareStatement(sql);<br> ResultSet rs = ps.executeQuery()) { ... } - 不能先声明变量再赋值,否则不会被自动管理
- 多个资源按声明的逆序关闭:rs → ps → conn,符合依赖关系,避免“连接已关却还要读结果集”的错误
手动关闭要写在 finally 里,且顺序不能错
如果因兼容旧代码或特殊逻辑无法用 try-with-resources,必须在 finally 块中逐个关闭,并严格倒序:
- 先检查是否为
null,再调用close() - 每个
close()都要套try-catch,防止前一个关闭异常导致后续资源漏关 - 关闭顺序必须是:
ResultSet→Statement→Connection
别让 Connection 变成全局或长期持有对象
Connection 是有状态、非线程安全的资源,不适合缓存或复用:
- 不要定义为 static 或类成员变量
- 不要在 JavaFX/Servlet 等多线程环境中跨方法传递原始 Connection 实例
- 推荐做法:每次操作都通过工具方法获取新连接,并立即配合 try-with-resources 使用
注意异常处理中的资源保障
try-with-resources 在异常场景下更可靠:
- 如果 try 块抛出异常,同时某个
close()也失败,主异常会被保留,关闭异常会作为 suppressed exception 被附加 - 可通过
exception.getSuppressed()查看被抑制的异常,便于排查连接池归还失败等问题 - 相比传统 finally + 多层 try-catch,它大幅减少样板代码和疏漏风险
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











