2011-02-13 103 views
1

我想知道如果ResultSet可以关闭,如果我没有关闭它?我有一个ResultSet是关闭的异常,但我确信我没有关闭ResultSet的任何地方。 我做完全是我用的ResultSet执行SELECT查询,然后我用同样的ResultSet,因为它是用这种方法叫: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的构造器中创建SQL语句:

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以后创建每当我想执行语句。

回答

7
the docs on ResultSet.close()

直接:

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

...

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

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

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

第三个答案:回答如上。

最后回答:显式释放资源,而不是等到Statement被关闭时关闭。

+0

这些实际上是2个不同的操作..我使用一个连接,所以我使用一个语句和许多结果集。这是问题吗? – Ahmed 2011-02-13 12:43:30

+1

@Ahmed如果您从上面粘贴的文档部分阅读了'Note',它说如果ResultSet被重新执行或者下一个结果被检索到,则ResultSet被关闭。所以,无论你采取什么方式,只有最后一个ResultSet是有效的,其他所有的都是关闭的。正如我所说,检索所有结果,将它们存储在某个地方,然后按照您的喜好阅读它们。 – mdrg 2011-02-13 12:55:12

0

如果您已关闭任何以下的,你的ResultSet会自动关闭:

  1. Statement对象。
  2. 连接对象。

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

0

我总是在finally {}块中关闭Connections,ResultSets和Statements。在这种情况下,我没有这个问题,因为这个块总是被执行(嗯,并不总是,但在这里它适合)。请参阅post,我放置了可能对您有意思的框架实现。