【问题标题】:new jre7 try block resources新的 jre7 尝试块资源
【发布时间】:2012-07-04 10:23:27
【问题描述】:

如果我做类似的事情

    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?

【问题讨论】:

    标签: java try-catch java-7


    【解决方案1】:

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

    【讨论】:

    • 在prepareStatement方法的签名中是否应该抛出异常,我认为是SQLException?
    • @tomasz_kusmierczyk 是的,你是对的 - 编辑了我的答案。谢谢!
    • 请参阅this question 以了解始终明确关闭 ResultSet 的其他原因(或使用 try-with-resources 语法将其关闭)。在 JDBC 驱动程序、连接池和数据库中常见的设计限制和错误都可能导致未关闭的 ResultSet 出现问题。
    【解决方案2】:

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

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

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

    【讨论】:

    • "在 finally 块中。每一次。"不对。 try-with-resources 的意义在于你不必这样做,但它不适用于他的情况下的ResultSet
    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 2015-06-21
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 2019-06-08
    相关资源
    最近更新 更多