C-Sharp

跟踪未關閉的連接

  • January 26, 2012

我每隔幾天就會在 IIS7 和 SQL 2008 伺服器之間收到超時錯誤。我得到的錯誤資訊是:

System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

有時這會自行解決,有時我需要手動重新啟動 SQL Server。有什麼辦法可以追查到這個錯誤的原因。我 90% 確定它在某個沒有我們的 ASP.NET 網路表單應用程序的地方,連接正在打開而不是關閉,但我無法確定原因。

您可以查詢sys.dm_exec_sessionslast_request_end_time列以查找打開但“休眠”的連接。

從中可以查到最後執行的SQL

SELECT session_id, TEXT
FROM sys.dm_exec_connections c
CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle) AS ST 
WHERE c.session_id = <suspicious one from sys.dm_exec_sessions>

我 90% 確定它在某個沒有我們的 ASP.NET 網路表單應用程序的地方,連接正在打開而不是關閉

我希望在您的網路表單中,您遵循下面提到的方法來處理IDisposable對象……

using (System.Data.SqlClient.SqlConnection con = new SqlConnection("YourConnection string")) { 
   con.Open(); 
   SqlCommand cmd = new SqlCommand(); 
   string expression = "Parameter value"; 
   cmd.CommandType = CommandType.StoredProcedure; 
   cmd.CommandText = "Your Stored Procedure"; 
   cmd.Parameters.Add("Your Parameter Name", 
               SqlDbType.VarChar).Value = expression;    
   cmd.Connection = con; 
   using (IDataReader dr = cmd.ExecuteReader()) 
   { 
       if (dr.Read()) 
       { 
       } 
   } 
}

引用自:https://dba.stackexchange.com/questions/11650