2012-04-15 39 views
1
try{ 
     String query= "select user_name from user"; 
     ResultSet rs = queries.performQuery(query); 

while(rs.next()){ 
     System.out.println("User Name :" + rs.getString("user_name")); 
     } 
另一類

我有這樣的事情:調用另一種方法獲取結果集並正確關閉連接?

public ResultSet performQuery(String query) throws SQLException 
    {  
     try 
     { 
       connection = DriverManager.getConnection(sqlUrl,sqlUser,sqlPassword); 
       stmt = connection.createStatement(); 
        rs = stmt.executeQuery(query); 
     } 

     catch(SQLException ex) 
     { 
     } 

     finally{ 
      close(rs); 
      close(stmt); 
      close(connection); 
     } 
     return rs; 
    } 

現在我得到的錯誤不允許操作的ResultSet關閉後,這是明顯的,因爲我關閉RS /語句/連接。

我沒有我的代碼,所以這只是我的頭頂,忽略任何語法錯誤,我希望我的問題仍然清楚。

所以我的問題是這樣的:

如果你想有一個例如執行查詢的方法,並調用在另一種方法,然後做rs.next,什麼是適當的方式來關閉ResultSet /語句/連接?對我來說關閉performQuery是有意義的,但是這給了我錯誤。

+1

那麼,你執行一個查詢並關閉ResultSet,但實際上*檢索結果行需要一個打開的ResultSet。因此,您唯一的選擇是在執行查詢後保持「ResultSet」處於打開狀態,以便檢索結果...之後,關閉它。創建1個方法可能會更好,這兩個方法都會執行查詢並檢索結果(如果這就是您之後的結果)。 – Torious 2012-04-15 18:54:41

回答

2

如果您使用的是ResultSet那麼它將需要連接來加載更多的行。例如,如果您的查詢返回1000條記錄,第一個結果集將持有41排在內存中,然後當你遍歷這個數字,你會使用連接到負載。在你的情況下記錄另一盤我會用RowSetfor more explanation read this

+0

謝謝,那麼你會如何建議關閉連接?只能在調用rs.next的方法中關閉?但然後我不能關閉連接和stmt,因爲它只包含rs的引用? – Brah 2012-04-15 19:14:12

+0

您可以返回一個ArrayList而不是ResultSet,在您的方法內迭代ResultSet並用記錄填充ArrayList,然後當您完成循環ResultSet時返回ArrayList – confucius 2012-04-15 19:17:03

1

ResultSet旨在允許流式傳輸結果,例如一次一個記錄。這就是爲什麼它不是簡單地返回某種類型的Collection,而是類似於迭代器。實際上,ResultSet可以通過打開的JDBC連接一次性懶惰地加載一條記錄。

這就是說,如果你對在同一時間在內存中的所有結果感到滿意 - 只是在關閉ResultSet之前急切地加載所有記錄。

相關問題