会不会 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)) {
// ...
}
是的,从技术上讲,当连接被关闭时,语句将被关闭。不过这并不是一个跳过正确声明资源的好理由。