ResultSet什么时候关闭?

时间:2011-02-13 12:05:25

标签: java jdbc

我想知道如果我没有关闭它,是否可以关闭ResultSet?我有一个ResultSet是关闭异常但我确信我没有关闭任何地方的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?

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

关闭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。

3 个答案:

答案 0 :(得分:7)

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

  

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

     

...

     

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

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

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

第三个答案:上面回答。

最后回答:显式释放资源,而不等待Statement声明时关闭它。

答案 1 :(得分:0)

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

  1. 陈述对象。
  2. 连接对象。
  3. 我强烈怀疑连接正在关闭。运行查询后,自然倾向于关闭数据库连接。虽然这是一个很好的做法,但是在使用TableModel类中的ResultSet对象之前,您可能正在关闭连接。

答案 2 :(得分:0)

我总是在finally {}块中关闭Connections,ResultSet和Statements。在这种情况下,我没有这个问题,因为这个块总是被执行(好吧,并不总是,但这里适合)。请参考这个post,我放置了可能对你感兴趣的骨架实现。