7

Javadoc 说 for .close()of thePreparedStatement说它..

立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待它自动关闭时发生。通常最好在使用完资源后立即释放资源,以避免占用数据库资源。

对已关闭的 Statement 对象调用方法 close 无效。

注意:当 Statement 对象关闭时,其当前的 ResultSet 对象(如果存在)也将关闭。

考虑以下场景

    MyConnector databaseConnector = DBManager.instance().getConnector();

    Connection con = databaseConnector.getConnection(); // returns java.sql.Connection
    PreparedStatement pstmt = null;

    try {
        pstmt = con.prepareStatement("some query");
         ...
    } finally {  
        if (pstmt != null)
            pstmt.close();
    }

在这个例子中,pstmt.close()也将关闭con

4

3 回答 3

13

关闭 aStatement 不会关闭 a Connection。但是,关闭 aConnection 关闭 a Statement

可以这样想:

  • 连接 -> 创建并自动关闭 -> 语句
  • 语句 -> 创建并自动关闭 -> ResultSet

所以关闭 aConnection将自动关闭任何StatementsResultSet它包含的任何s。

但是,如果可能的话,仍然认为最好手动关闭所有三个(ResultSet后跟)。StatementConnection

于 2012-05-09T22:00:29.793 回答
2

注意:当Statement对象关闭时,其当前的ResultSet [但不是 Connection] 对象(如果存在)也将关闭。

它不会关闭连接,它只是关闭结果集对象。

于 2012-05-09T22:00:45.980 回答
0

如果您使用的是 Java 7,并且try-with-resources无需担心关闭连接或Statement任何ResultSet.

try (Connection conn = databaseConnector.getConnection();
     PreparedStatement pstmt = conn.prepareStatement("some query")) {
    ...
} catch (Exception e) {
    ...
}
于 2012-05-09T22:07:52.917 回答