这个尝试与资源关闭我的连接?

问题描述 投票:0回答:1

会不会 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);
}

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

java jdbc garbage-collection
1个回答
3
投票

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

唯一能保证所有东西都被关闭的就是使用。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.