在准备另一个Statement之前是否需要关闭PreparedStatement

Is it necessary to close PreparedStatement before preparing another Statement

是否需要在一次db.getConnection()内关闭ResultSet和PreparedStatement?对于以下示例:

Connection conn = db.getConnection();
PreparedStatement pstmt = conn.prepareStatement(firstsql);
ResultSet r = pstmt.executeQuery();
// do something with the ResultSet
r.close();
pstmt.close();   // do I need close the r and pstmt here?
PreparedStatement pstmt = conn.prepareStatement(secondsql);
ResultSet r = pstmt.executeQuery();
// do something with the ResultSet again
r.close();
pstmt.close();
conn.close();
return null;

第5行和第6行的代码是必须的吗?

严格来说没有必要,因为你可以同时打开多个prepared statements。 必要的是 关闭每个打开的资源,如果以后不再使用的话。

查看您的代码,它并不能确保语句实际上已关闭。

为确保这一点,每个关闭操作都必须在 finally 块内完成:这样,无论操作成功与否,它都会执行。

示例代码:

PreparedStatement pstmt = null;
ResultSet r = null;
try {
    pstmt = conn.prepareStatement(firstsql);
    r = pstmt.executeQuery();
    // do something with the ResultSet
} finally {
    if (r != null) {
        try {
            r.close();
        } catch (SQLException e) {
            //log error
        }
    }
    if (pstmt != null) {
        try {
            pstmt.close();
        } catch (SQLException e) {
            //log error
        }
    }
}
//and do it again

如果您将 Java 7 与 try-with-resources 语句一起使用,则此代码可以 大大 简化:

try (PreparedStatement pstmt = conn.prepareStatement(firstsql);
      ResultSet r = pstmt.executeQuery();) {
    // do something with the ResultSet
}

没有。您可以同时打开多个语句。但你最终必须关闭它们。

您发布的代码无法编译,如果编译成功,就会发生资源泄漏,但这与您标题中的问题不同。