java - Java Statement/Resultset 对象的自动销毁
问题描述
我需要澄清一些关于 Java 如何处理不需要的对象的事情。作为我的“自学 Java”课程的一部分,我创建了一个返回 ResultSet 对象的库方法:
package libfunc;
.
.
public ResultSet getRecordset(String pSQL) throws Exception {
ResultSet retVal = null;
Statement st;
try {
st= con.createStatement();
retVal = st.executeQuery(pSQL);
} catch (Exception e) {
logFile.writeLog(Level.SEVERE, pSQL + "\n" + e);
throw e;
}
return retVal;
}
在获得更多知识后,我认为这可能是一种更好的做事方式:
public ResultSet getRecordset(String pSQL) throws Exception {
ResultSet retVal = null;
try (Statement st= con.createStatement()) {
retVal = st.executeQuery(pSQL);
} catch (Exception e) {
logFile.writeLog(Level.SEVERE, pSQL + "\n" + e);
throw e;
}
return retVal;
}
但是,进行更改后,调用方法中的以下代码失败,告诉我Resultset对象已经关闭:
package someApp;
.
import libfunc;
.
sql = "select * from a_table";
try (ResultSet rsT = libfunc.getRecordset(sql)) {
while (rsT.next()) {
Object[] rowdata = { rsT.getString("field1"), rsT.getString("field2"), rsT.getInt("uid") };
model.addRow(rowdata);
}
} catch (Exception e) {
some code
}
此时我意识到返回的Resultset 对象需要Statement 对象(st,在第二个库片段中的try{} 块之后自动丢弃)才能保持活动状态,因此必须保留原始代码。
这让我想知道 - 在我完成了结果集之后,我在库中创建的 Statement 对象会发生什么?调用方法的 Try{} 结束后是否会自动消失?
对同一个库方法进行多次调用是可行的,可能会留下几个 Statement 对象 - 我如何确定我没有留下任何会填满可用内存的杂散对象?
当我关闭显示数据的框架时,我也会调用 dispose(),但不确定这是否会处理所有底层对象。
解决方案
好的,在看了这篇文章之后,我对它的工作原理有了更多的了解,并意识到我的问题来自于我对库代码的概念有点过分热心!通过在处理填充列表的类中包含与数据库的连接,我克服了这个问题。
package someApp;
.
.
Connection con = some_db_connection;
.
.
.
String sql = "select * from a_table";
try (Statement st = con.createStatement(); ResultSet rsT = st.executeQuery(sql) ) {
while (rsT.next()) {
Object[] rowdata = { rsT.getString("Field1"), rsT.getString("field2"), rsT.getInt("uid") };
model.addRow(rowdata);
}
} catch (Exception e) {
some code
}
非常感谢@luk2302 为我指明了正确的方向!每天都是上学日...
推荐阅读
- python - 有没有更好的方法来聚合同一分组熊猫数据帧上的多个列?
- mongodb - 如何从数组中获取单个项目并将其显示为对象?而不是作为数组MongoDB
- java - 如何在Java中获取没有扩展名的文件?
- python - Python elif 语句正在将类型从浮点数更改为列表
- python - 安装 Scikit-learn 的问题
- javascript - 希望从 YouTube URL 自动生成适合书目的元数据
- mysql - 如何更改mysql服务器8上的root密码
- java - Mapstruct 和 Lombok 升级导致不同的初始化行为
- spring - Spring Security - 从安全性中排除 POST 请求
- java - 如何使用hibernate将三个表映射在一起