簡體   English   中英

為什么 JDBC 連接需要在 finally 塊中關閉?

[英]Why JDBC connections needs to close in finally block?

Connection conn = null;
Statement stmt = null; 
ResultSet rs = null;
try
{
    conn = geting the connection object ( using DriverManager.getConnection() method or using connection pool)
    stmt = conn.createStatement ("select ...");
   // some other logic here
}
catch (SQLException e)
{
    // handling the exceptions
}
finally
{

}

這里我的問題是在以下情況下關閉連接對象會出現什么問題。

  1. 假設如果沒有發生異常,在try 塊中它會自動關閉連接對象。

     try { // same above code stmt.close(); conn.close(); } catch(Exception ex) { // handling the exceptions } finally { }
  2. 如果發生某些異常,它將轉到catch 塊,在那里它會自動關閉連接對象。

     try { // same above code } catch(Exception ex) { // handling the exceptions stmt.close(); conn.close(); } finally { }
  3. finally 塊中關閉連接對象。

     try { // same above code } catch(Exception ex) { // handling the exceptions } finally { stmt.close(); conn.close(); }
  4. 使用 close() 方法關閉連接對象和使用 close() 關閉池連接之間的區別。

注意:請不要說在 finally 塊中關閉連接對象是好的。 我知道那個。 如果我在 try 塊中保持關閉連接,catch 塊是否有任何問題請解釋。

建議關閉finally塊中的連接,因為如果你有多個catch塊(你應該這樣做:你永遠不應該捕獲泛型Exception ),你就不必重新編寫結束語句。

無論發生什么, try總會執行finally塊。 因此,如果你得到一個NullPointerException ,或者你沒有處理的其他異常,使用finally塊你將確保你的資源正確關閉。

但如果您使用的是java 7,我建議使用try-with-resources

由於數據庫消耗的資源越來越多,因此建議您在處理完成后關閉連接,無論是否成功。

你說在try中添加conn.close() ,如果你的查詢運行沒有任何異常,這很好,如果你的查詢有任何問題,連接將不會被關閉。 所以總是建議在finally塊中關閉你的連接,無論是否發生異常,都會執行。 此外,如果您嘗試將結束語句放在catch塊中並嘗試處理多個異常,則需要重復您的代碼,這是不推薦的。

始終執行finally塊,包括以下情況:

  • try塊的正常終止。

  • 在某些catch中處理異常時異常終止try-block。

  • 異常傳播給調用者時異常終止。

  • 塊中間的return語句:

     try { if(something) return false; // finally is executed here as well ... } finally { ... } 
  • 如果整個try-catch在循環內,則為breakcontinue語句:

     while(condition) { try { if(something) continue; // finally is executed here else if(somethingElse) break; // finally is executed here ... } finally { } } 

因此無論你如何退出try塊, finally都會執行,你不應該關心檢查每一種可能的退出方式。 這真的很方便。

finally塊始終執行:

try{
 // code logic
 }catch(SQLException ex){
 // catch exception
 }finally{
   if (dbConnection != null){
            dbConnection.close();
       }
 }

答案是'我們必須在使用后關閉連接。' 但實際問題是為什么我們必須在使用后關閉連接?

1.)當我們創建與遠程數據庫服務器的連接時,可以說MySQL服務器,它還為您保持連接打開。 由於數據庫服務器端還存在允許連接數量的限制/配置。 如果我們不關閉來自我們端的連接,它將保持打開狀態,在數據庫服務器端將超過一小段允許的連接后,我們將無法與該數據庫建立進一步的連接。

2.) 數據庫服務器端的自動釋放連接時間設置。

如果我們沒有從我們的結束關閉連接並且我們在一段時間內沒有執行任何查詢(因為我認為MySql中的默認時間設置是28800秒。意味着8小時。雖然我們可以更改它。)它會自動從服務器端釋放連接。

重要! 當你的jdbc Connection對象真正在數據庫服務器端發布並且你認為它仍然連接因為你從未斷開/關閉它並且你試圖使用語句在該連接上執行查詢時會發生什么情況。 真的很關鍵

這就是為什么我們必須始終關閉連接並在連接的連接對象上執行語句。

  • 如果您未處理的異常被拋出會發生什么? (我希望你沒有抓住Throwable ...)
    • 如果從try塊內部返回會發生什么?
    • 如果catch塊拋出異常會發生什么?

finally塊確保無論你退出該塊(模式顯式地中止整個過程的幾種方式),它都會被執行。 這對於確定性清理資源非常重要。

注意:另外為了防止應用程序資源泄漏,我們必須關閉連接.. !!

謝謝。!!

你可以在try或catch塊中關閉連接,但會告訴你為什么在finally塊中關閉連接是好的

假設您嘗試了catch塊,如下所示:

try{
stmt1..
stmt2..
conn.close
}
catch(exception e){
}

現在假設exception is raised by stm1那么你的連接將保持打開狀態。

現在考慮你正在關閉catch塊中的連接.. what if no exception raised then control will never come in catch block ..這里連接仍然是打開的...我希望我能夠清除你們中的一些疑問。

最好使用try-with-resources語句。

什么是資源嘗試?

在Java中,try-with-resources語句是一個聲明一個或多個資源的try語句。 資源是一個在完成程序后必須關閉的對象。 try-with-resources語句確保在語句執行結束時關閉每個資源。

示例

try (Connection con = DriverManager.getConnection(myConnectionURL);
         PreparedStatement ps = createPreparedStatement(con, userId); 
         ResultSet rs = ps.executeQuery()) {

         // process the resultset here, all resources will be cleaned up

    } catch (SQLException e) {
        e.printStackTrace();
    }

在上面的示例中,Connection,PreparedStatement和ResultSet都在try塊的末尾自動關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM