1

假设我PreparedStatement从一个Connection对象中得到一个,然后我用另一个覆盖引用PreparedStatement。然后,后来,我close()的参考。第一个PreparedStatement(我失去参考的那个)会保持开放吗?或者是否有一些协议或垃圾收集来处理这个问题?

例如:

PreparedStatement ps = connection.prepareStatement(MY_QUERY);
// do stuff
ps.execute();

ps = connection.prepareStatement(MY_OTHER_QUERY);
// do stuff
ps.execute();

ps.close();

第一个PreparedStatement对象(用于执行的对象)是否MY_QUERY保持打开状态?

4

3 回答 3

7

是的,PreparedStatement它将保持打开状态,直到它被垃圾收集*(如果有的话)。

这就是为什么你总是看到总是释放(关闭)你获得的外部资源的规则。

JDBC 资源(例如这个准备好的语句、连接、结果集)和 IO 资源(套接字、流等)是您在 Java 中需要手动管理的两种最常见的资源。

* 严格来说,它可以在方法中被关闭,该finalize方法可能在它被 GC之前,但它符合 GC 的条件之后,但对于本次讨论来说,这已经足够接近了。

于 2012-12-20T15:32:11.143 回答
1

当对象最终被垃圾收集时,它将被关闭。由于您对垃圾收集过程几乎没有控制权,因此最好在完成语句后立即关闭它们。

从文档中Statement.close()

立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待它自动关闭时发生。通常最好在使用完资源后立即释放资源,以避免占用数据库资源。

于 2012-12-20T15:33:44.840 回答
1

它将保持打开状态,并且不能保证在垃圾收集时它会关闭。这取决于实施。实现需要像 FileInputStream.finalize 那样覆盖 finalize

“...确保在没有更多引用时调用此文件输入流的关闭方法。”

但是 Connection.close 可以关闭 PreparedStatement,参见 Connection.close 的 API:

“..立即释放此 Connection 对象的数据库和 JDBC 资源,而不是等待它们自动释放..”

但前提是它不是池连接。

于 2012-12-20T15:49:12.407 回答