2009-10-21 52 views
0

我正在使用JDBC從數據庫檢索數據。我瞭解,聲明需要在使用後關閉。但是,我一直遇到同樣的錯誤,告訴我在語句關閉後不允許任何操作。我的代碼的結構就像在JDBC中關閉語句的位置

public void foo() { 

Statement; 
try { 
} catch{ 
} 
Statement.close(); 
} 

在我的代碼中,我需要重複調​​用此函數。我想知道在哪裏結束聲明。

感謝

回答

4

根據the JavadocsStatement.close()釋放此Statement對象的數據庫和JDBC資源,而不是等待時,自動關閉這種情況發生。一旦您完成了資源釋放資源以避免捆綁數據庫資源,通常是一種很好的做法。 這意味着你應該在完成後關閉它,而不打算再次使用它。實際上,我會更加關注關閉連接。

在你說你重複呼叫的方法中,你打電話給Statement.close()這意味着你只能使用它一次,因爲在第一次調用你聲明關閉並且不能再使用之後。

這將是很高興看到您的一些代碼,如果你想有一個更好的答案

+0

一樣。在我的實踐中,只需將close()放在代碼的最後,不再需要額外的行來執行。 – Raptor 2009-10-21 03:55:41

+1

使用Java 7,您可以使用AutoCloseable對JDBC語句的支持:'try(Statement statement = ....){/ * use statement,它會自動關閉* /}'這樣可以節省您編寫'finally'塊。 – Kay 2013-02-20 19:28:26

2

注意,JDBC資源,應該始終被關閉,因此,它能夠更好地把那個給「終於」塊。

您也可以考慮使用Spring DAO - 它是JDBC之上的一個精簡包裝器,涵蓋了大部分JDBC樣板文件。

0
  1. ResultSets也需要結束。

  2. 聽起來你可能正在做類似訪問Blob的事情,Blob對象通常會通過連接返回來從數據庫中讀取字節數據。因此,在關閉連接之前,請先讀取所有的byte []數據。如果這是不可能的,因爲數據量太大,而且您正在嘗試傳輸字節,那麼您將不得不將該連接保存在安全的地方,稍後再關閉它。

  3. 關閉聲明應該進入finally塊,並且是空的保護 - 但它是這樣常見和醜陋的代碼,所以堅持在某個地方的靜態方法。


public List someMethod() { 

    Statement stmt; 
    ResultSet rset; 
    try { 
     stmt = con.createStatement(); 
     rset = stmt.executeQuery(....); 

     List resultList = ...create a list 
          // get the data from the rset 

          return resultList; 
    } catch (SQLException ex) { 
     throw new MyDatabaseException(ex); 
    } finally { 
    } 

} 

public class DatabaseUtils { 

    public void close(Statement stmt, ResultSet rset) { 
     try { 
      if (rset != null) { 
       rset.close(); 
      } 
     } catch (SQLException ex) { 
      throw new MyDatabaseException(ex); 
     } finally { 
      if (stmt != null) { 
       throw new MyDatabaseException(ex); 
      } 
     } 
    } 
} 
+1

該代碼甚至沒有編譯 - 如果它確實沒有多大意義。 – Bombe 2009-10-21 06:46:18

+0

是的 - 部分我很匆忙,而且由於某種原因我得到了代碼格式化的問題,我只是放棄了,並帶着主要想法去做。雖然我看到我錯過了對finally塊中的DatabaseUtils.close()方法的調用。下面的人有這樣的想法:-) – 2009-10-21 20:23:38

+1

當您關閉語句時,ResultSet會自動關閉。 (請參閱JavaDoc http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement。html) – 2011-01-20 09:51:15