2011-02-13 110 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,我放置了可能對您有意思的框架實現。