如果引用被覆盖,PreparedStatement是否会"打开"?

ast*_*eri 1 java database-connection prepared-statement

假设我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();
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*uer 7

是的,PreparedStatement将被打开,直到它被收集垃圾*(如果有的话).

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

JDBC资源(例如此预准备语句,连接,结果集)和IO资源(套接字,流,...)是您手动需要在Java中管理的两种最常见的资源.

*严格来说,它可以finalize方法中关闭,可能它获得GC 之前稍微有点,但它有资格获得GC后,但是对于这个讨论,这已经足够接近了.