2012-04-27 71 views
0

我正在捕捉一個SQL異常,而不是重新拋出它。這似乎意味着連接不會按照我的預期返回到池中。這可能嗎?ADO.NET有趣的連接池行爲時,埋葬SQL異常

 using (IDbCommand paymentCommand = this.Connection.CreateCommand()) 
     { 
      try 
      { 
       //database stuff 
      } 
      catch (SqlException ex) 
      { 
       //LOG CALL 
      } 
     } 
+0

爲什麼你期望的連接,在這種情況下返回到池?你沒有明確地關閉/處理它,並且它沒有包含在「using」塊中。 – LukeH 2012-04-27 12:50:37

+0

你應該向我們展示你正在初始化和關閉連接的代碼(using-statement?)。通常,使用語句不僅在發生未處理的異常時調用dispose,而且始終如此,所以您的問題還不清楚。 – 2012-04-27 13:03:20

回答

0

爲什麼你不把(...){}放在try {}塊內?這種方式即使拋出異常,使用block會關閉IDBcmd obj。

0

在你的問題中你不清楚你是如何創建連接的,但你確實需要確保你打開它,然後關閉它,不管錯誤與否。

通常我會做這樣的事情:

SqlConnection connection = null; 
try { 
    connection.Open(); 

    // Do stuff like run a query, setup your IDbCommand, etc. 
} catch (Exception ex) { 
    // Log error 
} finally { 
    if (connection != null) { 
     connection.Close(); 
    } 
} 

這樣,不管發生什麼事,你的連接將被關閉並返回到池中。如果您未能關閉(),您將「泄漏」該連接,並最終耗盡池中的連接進行繪製。連接的生命週期通常應該與發出sql命令所需的時間一樣長,此時應該關閉連接。

0

目前尚不清楚您在連接池中遇到的情況。然而,我會絕對包裝你的連接using聲明

這是我經常使用(注意,dac.GetConnection()很簡單,就是集中的代碼來獲得一個連接對象的類):

using (SqlConnection connection = dac.GetConnection()) 
{ 
    using (SqlCommand command = new SqlCommand("myProc", connection)) 
    { 
    command.CommandType = CommandType.StoredProcedure; 
    try 
    { 
     connection.Open();   
     //add params, run query 

    } 
    catch (Exception ex) 
    { 
     //handle/log errror 
    } 
    finally 
    { 
     if (connection.State == ConnectionState.Open) 
     connection.Close(); 
    } 
    } 
}