这会尝试使用资源关闭我的连接吗?

Will this try with resources close my Connection?

这个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);
}

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

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

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

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

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