java - 这会尝试使用资源关闭我的连接吗?
问题描述
尝试使用资源后会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 只会关闭分配给资源子句中变量的对象。因此,在子句中创建的未分配给变量的中间对象不会被 try-with-resources 关闭。
确保一切都关闭的唯一方法是使用:
try (Connection conn = DriverManager.getConnection(connection);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
// ...
}
是的,从技术上讲,当连接关闭时,语句将被关闭。不过,这不是跳过正确声明资源的好理由。
推荐阅读
- django - 从 excel 文件中获取数据并制作可编辑的数据网格
- html - 我想对@Html.DisplayFor 做除法操作
- elasticsearch - Elasticsearch:将记录插入索引时我不想创建索引映射
- python - botocore.exceptions.SSLError:SSL 验证失败
- django - 你怎么看一个http请求包含什么
- facebook-graph-api - facebook Ads Api 深度复制/导出 CAMAPIGN-ADSETS-ADS 数据
- typescript - 接口和联合的命名约定,首先想到我想给出相同的名称?
- android - 从磨损中按下按钮并在手机上做某事
- java - 如何在下面定位元素硒中的标签
- tableau-api - 第二层经度纬度中的画面双轴映射问题