【问题标题】:When is ResultSet closed?ResultSet 何时关闭?
【发布时间】:2011-02-13 12:05:25
【问题描述】:

我想知道如果我没有关闭 ResultSet 是否可以关闭?我有一个 ResultSet is closed 异常,但我确定我没有在任何地方关闭 ResultSet 。 我所做的是我使用 ResultSet 执行 SELECT 查询然后我使用相同的 ResultSet 因为它是由这个方法调用的:

public Object getValueAt( int row, int column )
        throws IllegalStateException {
    // ensure database connection is available
    if ( !dbConnection.isConnectedToDatabase() )
        throw new IllegalStateException( "Not Connected to Database" );

    // obtain a value at specified ResultSet row and column

    try {
        getResultSet().absolute( row + 1 );
        return getResultSet().getObject( column + 1 );
    } // end try
    catch ( SQLException sqlException ) {
        System.out.println("Exception from here dude");
        sqlException.printStackTrace();
    } // end catch

    return ""; // if problems, return empty string object
} // end method getValueAt

那么,另一个问题:有没有办法确保 ResultSet 被打开?

第三个问题:可能是因为我从不关闭 ResultSets 的问题。

关闭 ResultSet 有什么意义?

编辑:这就是在名为 DBConnection 的类的构造函数中创建语句的方式:

Class.forName(driver);
        // connect to database
        connection = DriverManager.getConnection(url, username, password);

        // create Statement to query database
        statement = connection.createStatement(
     ResultSet.TYPE_SCROLL_INSENSITIVE,
     ResultSet.CONCUR_READ_ONLY );

        //connection ok
        connectedToDatabase=true;

ResultSet 稍后在我想执行语句时创建。

【问题讨论】:

    标签: java jdbc


    【解决方案1】:

    直接来自the docs on ResultSet.close()

    立即释放此 ResultSet 对象的数据库和 JDBC 资源,而不是等待它自动关闭时发生。

    ...

    注意:当 Statement 对象关闭、重新执行或用于从多个结果序列中检索下一个结果时,生成它的 Statement 对象会自动关闭 ResultSet 对象。

    因此,如果您关闭了生成 ResultSet 的 Statement,您将得到该异常。

    另一个问题的答案:您不应该从这样的 ResultSet 中读取结果。执行 select 并一次从 ResultSet 中读取您需要的所有数据,关闭连接,然后您可以根据需要读取获取的数据。你真的不应该有一个外部资源/类调用你的 getValueAt 方法,你希望它仍然连接到数据库。连接可能由于许多其他原因而终止,所以这不是要走的路。

    第三个答案:上面已经回答了。

    最后一个答案:显式释放资源,而不是等待Statement时关闭。

    【讨论】:

    • 这实际上是 2 个不同的操作。我使用一个连接,所以我使用一个语句和多个结果集。是这个问题吗?
    • @Ahmed 如果您阅读了我上面粘贴的文档部分的“注释”,它表示如果重新执行 ResultSet 或检索到多个结果的下一个结果,则该 ResultSet 将关闭。因此,无论您采取什么方法,只有最后一个 ResultSet 是有效的,而所有其他的都是关闭的。正如我所说,检索所有结果,将它们存储在某个地方,然后随意阅读它们。
    • 如何同时使用您的方法和 ResultSetTableModel ? ResultSetTableModel 直接处理结果集。
    • @Ahmed Raccoon.GUI.ResultSetTableModel?我以前从未听说过这个类,更不用说使用它了。在这种情况下,您可以进行搜索,显示结果然后关闭它。否则,将每一行数据读入一个数组或特殊对象,将每行数据放入一个列表/数组中,关闭ResultSet,然后使用此列表/数组读取和显示数据,而不用担心关闭连接或任何事情,比如我之前说过。
    【解决方案2】:

    如果您关闭了以下任何一项,您的 ResultSet 将自动关闭:

    1. 语句对象。
    2. 连接对象。

    我强烈怀疑连接正在关闭。一旦运行查询,关闭数据库连接是一种自然趋势。虽然这是一个很好的做法,但您可能在使用 TableModel 类中的 ResultSet 对象之前就关闭了连接。

    【讨论】:

    • 没有。也许是因为我对所有查询都使用了一个语句实例?
    【解决方案3】:

    我总是在 finally {} 块中关闭连接、结果集和语句。在这种情况下,我没有这个问题,因为这个块总是被执行(嗯,不总是,但它适合)。请参考这个post,我放置了你可能感兴趣的骨架实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 2021-11-15
      • 2010-11-05
      • 2019-06-05
      • 2018-08-16
      相关资源
      最近更新 更多