C-Sharp
跟踪未關閉的連接
我每隔幾天就會在 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_sessions
該last_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()) { } } }