自动销毁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{}块之后自动丢弃)来保持活动,因此原始代码必须保留。

这让我想知道-在我完成了Resultset之后,我在库中创建的Statement对象会发生什么?当调用方法的Try{}完成时,它是否自动停止存在?

这是可行的,有几个调用相同的库方法,可能会留下几个语句对象-我怎么能确定我没有留下任何流浪的对象,将填补可用的内存?当我关闭显示数据的Frame时,我还调用dispose(),但我不确定这是否会处理所有底层对象。

看了这篇文章后,我对它的工作原理有了更多的了解,并意识到我的问题来自于我对库代码的概念有点过于热心!通过在处理填充列表的类中包含到DB的连接,我克服了这个问题。


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为我指出了正确的方向!每天都是上学的日子。

最新更新