新的jre7尝试阻止资源

时间:2012-07-03 22:38:22

标签: java try-catch java-7

如果我做的话

    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?

2 个答案:

答案 0 :(得分:4)

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

  

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

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

但是,请注意明确关闭ResultSet是一个很好的做法,建议遵循,因此遵循良好做法的修改后的代码如下所示:

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;
}

答案 1 :(得分:0)

始终作为一种好习惯,请尝试关闭 ResultSet和 PreparedStatements。在最后一块。 每次,管理异常,这样就不会让资源无人看管(是泄漏的常见原因)。

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

编辑:立场纠正。如果resultset是作为try-with-resource创建的,那么你的PS就会死掉。