3

如果我做类似的事情

    try (
        Connection conn = Database.getConnection();
        PreparedStatement ps = conn.prepareStatement("SELECT * FROM table WHERE something = ? LIMIT 1");
    ) {
        ps.setString(1, "hello world");
        ResultSet results = ps.executeQuery();
        if(results.next()) {
            // blah
        }
    } catch(SQLException e) {
        e.printStackTrace();
    }

当 PreparedStatement 关闭时,ResultSet 是否仍会关闭,还是我还必须显式关闭 ResultSet?

4

2 回答 2

4

根据javax.sql.Statement.close()方法的 JavaDoc:

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

因此,回答您的问题 - 是的,ResultSet将在您的情况下自动关闭,因为相关Statement已在try-with-resources块中关闭。

但是,请注意,明确关闭ResultSets 是一种建议遵循的良好做法,因此您按照良好做法修改的代码如下所示:

try (
    Connection conn = Database.getConnection();
    PreparedStatement ps = prepareStatement(conn, "SELECT * FROM table WHERE something = ? LIMIT 1", param);
    ResultSet results = ps.executeQuery();
) {        
    if(results.next()) {
        // blah
    }
} catch(SQLException e) {
    e.printStackTrace();
}

private static PreparedStatement prepareStatement(Connection connection, String sql, String param) throws SQLException {
    final PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1, param);
    return ps;
}
于 2012-07-03T23:21:44.717 回答
0

始终作为一种好的做法,请尝试关闭您的ResultSets 和PreparedStatements。在 finally 块中。每一次,管理异常,所以你不会让资源无人看管(这是泄漏的常见来源)。

除非您将它们注入方法,否则调用方法可能需要它们。

编辑:立场更正。如果结果集是作为 try-with-resource 创建的,则会随着您的 PS 而死。

于 2012-07-03T23:01:53.590 回答