首页 > 解决方案 > 这会尝试使用资源关闭我的连接吗?

问题描述

尝试使用资源后会Connection关闭吗?

public static String readString(String connection, String sql) throws SQLException {
    try (ResultSet rs = DriverManager.getConnection(connection).createStatement(sql).executeQuery()) {
        if (rs.next()) {
            return rs.getString(1);
        }
    }
    return "";
}

我确定ResultSet将,不确定连接。

更有趣的是,如果我用不同的方法生成连接会怎样?:

public static String readString(String connection, String sql) throws SQLException {
    try (ResultSet rs = myMethod(connection).createStatement(sql).executeQuery()) {
        if (rs.next()) {
            return rs.getString(1);
        }
    }
    return "";
}

Connection myMethod(String connection){
    return DriverManager.getConnection(connection);
}

这让我感到困惑,因为我有一些内存泄漏,但我不确定这是否是罪魁祸首。

标签: javajdbcgarbage-collection

解决方案


不,连接和语句不会在您的代码中关闭(尽管它们可能会在稍后被垃圾收集器回收)。try-with-resources 只会关闭分配给资源子句中变量的对象。因此,在子句中创建的未分配给变量的中间对象不会被 try-with-resources 关闭。

确保一切都关闭的唯一方法是使用:

try (Connection conn = DriverManager.getConnection(connection);
     Statement stmt = conn.createStatement();
     ResultSet rs = stmt.executeQuery(sql)) {
    // ...
}

是的,从技术上讲,当连接关闭时,语句将被关闭。不过,这不是跳过正确声明资源的好理由。


推荐阅读