You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JDBC疑问:try块实例化的PreparedStatement未在finally可访问时,关Conn会关闭它吗?

问题解答

是的,关闭Connection对象时,由它创建的PreparedStatement、ResultSet等关联资源都会被自动关闭,哪怕这些对象是在try块内实例化、无法在finally块中直接访问的情况,这个规则依然适用。

JDBC规范明确要求:当Connection被关闭时,所有依赖该Connection创建的Statement(包括其子类PreparedStatement)、ResultSet都必须被自动释放。主流数据库的JDBC驱动(比如MySQL、PostgreSQL、Oracle驱动)都严格遵循这一规范,所以你不用担心这类场景下的资源泄漏问题。

不过正如你所说,显式关闭PreparedStatement是更好的实践——比如使用Java 7+的try-with-resources语法,它能自动管理所有实现了AutoCloseable接口的资源,代码更简洁且能避免个别驱动实现可能存在的边缘情况:

try (Connection conn = getConnection();
     PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM table")) {
    // 执行数据库操作
} catch (SQLException e) {
    // 异常处理
}

这里不需要手动关闭任何资源,try块结束后conn和pstmt都会被自动关闭,顺序是先关闭pstmt再关闭conn,更符合资源释放的逻辑。

内容的提问来源于stack exchange,提问作者Divya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 02:14:52