在指向另一个之前是否有必要关闭PreparedStatement?

时间:2018-12-01 09:42:29

标签: java mysql jdbc

我知道在这里问了一个非常相似的问题: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个对象。

1 个答案:

答案 0 :(得分:0)

首先,请注意,由于您声明了新变量pstmtr,而这些变量仍在作用域中,因此该代码将无法编译。

如果不是,那么在为它们分配新值之前,一定要关闭pstmtr。通过为这些变量分配新值,您实际上将失去对先前值的引用,并且将无法关闭它们,从而导致资源泄漏。

作为旁注,请注意,此类通常具有其finalize方法调用close,因此,垃圾收集器收集它们的迟早将被关闭,但是您永远不要依赖于此行为。