2011-11-24 50 views
14

基本上我有(忽略異常處理等):在Derby(JDBC)中提交事務之前,我可以關閉事務中的語句嗎?

connection.setAutoCommit(false); 

Statement statement1 = connection.createStatement(); 
statement1.executeUpdate("..."); 
statement1.close(); 

Statement statement2 = connection.createStatement(); 
statement2.executeUpdate("..."); 
statement2.close(); 

connection.commit(); 

如果我理解正確的話應該不會有任何影響,因爲它所做的事情是免費爲GC的資源。 Especially with Derby:當不再需要時,您應該顯式關閉語句,結果集和連接。與Derby的連接是應用程序外部的資源,垃圾收集器不會自動關閉它們。

但它會導致交易的任何問題?我不相信交易依賴於該聲明。任何人都可以請確認嗎?

+0

看來,如果關閉一個Statement,_transaction_仍然在數據庫端打開(等待提交或回滾)。只有在向連接發出提交或回滾命令時才結束/關閉。我對嗎? – ADTC

回答

15

當然,你可以關閉他們,你應該。

+2

+1爲「應該」 –

+0

我同意。但是,在交易終止之前還是必須在交易完成之後呢? –

6

一般而言,一旦執行Statement,底層數據源/數據庫負責確保成功執行。預計任何故障都會導致Statement.executeXXX調用中出現SQLException。任何成功的執行都會導致數據庫在臨時工作區中跟蹤這些更新。提交事務只能確保由語句引起的更新從臨時工作區寫入耐用存儲區。大多數/所有數據庫都是這種情況。

因此,一旦您不再需要它就可以安全地關閉Statement對象,而不會在事務中遇到任何副作用。

0

當然,在提交事務之前關閉語句是安全的。您應該閱讀來自coderanch和JDBC事務處tutorialClosing Statement object prior to committing

+2

我做到了,兩者其實都是。 Java牧場評論從「我相信」開始,這不是確認,也沒有人推動它,討論正好相反。在提交之後,JDBC教程關閉finally塊中的語句。而且,如果您之前關閉了聲明,則沒有提及會發生什麼情況。所以請注意你的評論,這不是很明顯,也沒有在任何一篇參考文獻中說明...... –

1

是的。在進行交易之前,它是一種很好的做法和方法來完成聲明。

相關問題