首页 > 解决方案 > 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(),但不确定这是否会处理所有底层对象。

标签: javajdbcmemory-leaksresultset

解决方案


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


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


推荐阅读