这会尝试使用资源关闭我的连接吗?
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)) {
// ...
}
是的,从技术上讲,语句将在连接关闭时关闭。不过,这不是跳过正确声明资源的好理由。
这个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)) {
// ...
}
是的,从技术上讲,语句将在连接关闭时关闭。不过,这不是跳过正确声明资源的好理由。