是否有必要在准备另一个声明之前关闭PreparedStatement

时间:2015-10-02 07:21:55

标签: java database jdbc prepared-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行的代码是否必要?

2 个答案:

答案 0 :(得分:9)

严格来说,没有必要,因为您可以同时打开多个预准备语句。 必要的是关闭每个打开的资源,如果以后不再使用它。

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

为了确保这一点,每个关闭操作必须在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

如果您使用带有try-with-resources语句的Java 7,则此代码可以极大简化:

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

答案 1 :(得分:3)

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

您发布的代码无法编译,如果确实存在,则会导致资源泄漏,但这与您标题中的问题不同。