我正在使用JDBC從數據庫檢索數據。我瞭解,聲明需要在使用後關閉。但是,我一直遇到同樣的錯誤,告訴我在語句關閉後不允許任何操作。我的代碼的結構就像在JDBC中關閉語句的位置
public void foo() {
Statement;
try {
} catch{
}
Statement.close();
}
在我的代碼中,我需要重複調用此函數。我想知道在哪裏結束聲明。
感謝
我正在使用JDBC從數據庫檢索數據。我瞭解,聲明需要在使用後關閉。但是,我一直遇到同樣的錯誤,告訴我在語句關閉後不允許任何操作。我的代碼的結構就像在JDBC中關閉語句的位置
public void foo() {
Statement;
try {
} catch{
}
Statement.close();
}
在我的代碼中,我需要重複調用此函數。我想知道在哪裏結束聲明。
感謝
根據the JavadocsStatement.close()
釋放此Statement對象的數據庫和JDBC資源,而不是等待時,自動關閉這種情況發生。一旦您完成了資源釋放資源以避免捆綁數據庫資源,通常是一種很好的做法。 這意味着你應該在完成後關閉它,而不打算再次使用它。實際上,我會更加關注關閉連接。
在你說你重複呼叫的方法中,你打電話給Statement.close()
這意味着你只能使用它一次,因爲在第一次調用你聲明關閉並且不能再使用之後。
這將是很高興看到您的一些代碼,如果你想有一個更好的答案
注意,JDBC資源,應該始終被關閉,因此,它能夠更好地把那個給「終於」塊。
您也可以考慮使用Spring DAO - 它是JDBC之上的一個精簡包裝器,涵蓋了大部分JDBC樣板文件。
ResultSets也需要結束。
聽起來你可能正在做類似訪問Blob的事情,Blob對象通常會通過連接返回來從數據庫中讀取字節數據。因此,在關閉連接之前,請先讀取所有的byte []數據。如果這是不可能的,因爲數據量太大,而且您正在嘗試傳輸字節,那麼您將不得不將該連接保存在安全的地方,稍後再關閉它。
關閉聲明應該進入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);
}
}
}
}
該代碼甚至沒有編譯 - 如果它確實沒有多大意義。 – Bombe 2009-10-21 06:46:18
是的 - 部分我很匆忙,而且由於某種原因我得到了代碼格式化的問題,我只是放棄了,並帶着主要想法去做。雖然我看到我錯過了對finally塊中的DatabaseUtils.close()方法的調用。下面的人有這樣的想法:-) – 2009-10-21 20:23:38
當您關閉語句時,ResultSet會自動關閉。 (請參閱JavaDoc http://download.oracle.com/javase/1.4.2/docs/api/java/sql/Statement。html) – 2011-01-20 09:51:15
一樣。在我的實踐中,只需將close()放在代碼的最後,不再需要額外的行來執行。 – Raptor 2009-10-21 03:55:41
使用Java 7,您可以使用AutoCloseable對JDBC語句的支持:'try(Statement statement = ....){/ * use statement,它會自動關閉* /}'這樣可以節省您編寫'finally'塊。 – Kay 2013-02-20 19:28:26