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
相关产品推荐
相关产品推荐

