ResultSet什么时候关闭?

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

直接来自ResultSet.close()上的文档 :

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

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

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

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

第三个答案:上面回答。

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

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

  1. 声明对象。
  2. 连接对象。

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

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