2012-08-01 97 views
1

在JDBC literatur我經常遇到像方法終止時是否需要關閉連接和語句?

void databaseCall() { 
    Connection con = null; 
    Statement statement = null   
    try {  
      con = getConnection(...);  
      statement = con.createStatement(...);   
      // do some query 
    } catch (SQLException e) { 
     // bla bla 
    } finally { 
     try {con.close();} catch (Exception e1) {} 
     try {statement.close();} catch (Exception e1) {} 
    } 
} 

片斷我知道這是最好的做法,關閉連接和語句明確地,但是,在這種情況下,顯然是資源constatement會時結束該方法被關閉,即當try塊完成時。 finally區塊中的close聲明真的有必要嗎?即使我們沒有明確地釋放資源,當方法結束時它們不會被關閉嗎?

+0

你應該把'close()'調用到'finally'塊中。如果你沒有正確地關閉資源,即使客戶端程序已經完成,某些DBMS也會保留這些東西。 – 2012-08-01 11:10:00

+0

謝謝。糾正。 – gefei 2012-08-01 11:12:50

+0

@ G.Z。類似於你的疑問被解釋[這裏](http://stackoverflow.com/questions/11750708/statement-and-resultset-close-after-connection-close) – user75ponic 2012-08-01 12:09:31

回答

4

不,他們不會被關閉。

如果getConnection()創建一個新的連接,那麼在該方法結束時唯一會發生的情況是連接可能被垃圾收集。但GC不會爲你調用close()方法。無論如何,你想盡快關閉。

大多數情況下,getConnection()只會從連接池中獲得連接,並保持很長一段時間。如果連接不是close(),則不會將其放回可用連接池中,幾秒或幾分鐘後,您將不再有任何可用連接。

標題詢問System.exit(),但問題正文沒有。如果您撥打System.exit(),則連接將最終關閉,因爲數據庫會注意到通信中斷。但是程序啓動,執行查詢和退出的情況非常罕見。大多數應用程序開始並保持運行數天甚至數月。所以,一旦完成使用,你真的想要釋放連接。

-2

假設您爲ekart應用程序帶來了20個連接,這意味着連接池只有20個連接。如果您向服務器發送請求,則池爲每個請求提供連接。如果您不關閉連接, 'OutOfConnectionError',即使你不能處理這個錯誤,你也無法發送請求,因爲沒有連接。如果你關閉連接,那麼只有你可以發送新的請求.........

相關問題