我知道在这里问了一个非常相似的问题:Is it necessary to close PreparedStatement before preparing another Statement 但是即使看了答案,我仍然很困惑。
如果说的话,我将OP的代码修改为此:
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet r = null;
try{
conn = db.getConnection();
pstmt = conn.prepareStatement(firstsql);
r = pstmt.executeQuery();
// do something with the ResultSet
r.close(); // do I need this line?
pstmt.close(); // do I need this line?
PreparedStatement pstmt = conn.prepareStatement(secondsql);
ResultSet r = pstmt.executeQuery();
// do something with the ResultSet again
}
finally{
if(r!=null)
r.close();
if(pstmt!=null)
pstmt.close();
if(conn!=null)
conn.close();
我需要这两行吗?我知道r和pstmt都将不可避免地被关闭(无论是否存在运行时错误),因为它们位于finally块中,但 两个指针。
在整个代码中均指向许多不同的PreparedStatement和ResultSet对象的指针。在指向其他对象之前,我不需要关闭那些对象吗?
在我看来,如果这段代码缺少这2行,那只会确保仅关闭r和pstmt指向的最后2个对象。
答案 0 :(得分:0)
首先,请注意,由于您声明了新变量pstmt
和r
,而这些变量仍在作用域中,因此该代码将无法编译。
如果不是,那么在为它们分配新值之前,一定要关闭pstmt
和r
。通过为这些变量分配新值,您实际上将失去对先前值的引用,并且将无法关闭它们,从而导致资源泄漏。
作为旁注,请注意,此类通常具有其finalize
方法调用close
,因此,垃圾收集器收集它们的迟早将被关闭,但是您永远不要依赖于此行为。