Dot-Net

從池中獲取連接之前的超時時間已過 - 但池未滿

  • February 3, 2012

我什至討厭提起這個 b/c 有數百頁談論這個錯誤可以追溯到 7-8 年……但是,我不能完全弄清楚這一點。

我在伺服器 A 上執行了一個報表服務,該服務連接到伺服器 B 上的 SQL Server 2008 R2。兩台伺服器都執行 Windows Server 2008。報表服務是多執行緒的,每次最多可以在自己的執行緒上執行 10 個報表。

我的連接字元串如下:

Data Source=ServerB;Initial Catalog=DBName;trusted_connection=YES;Connection Timeout=0;Max Pool Size=500;

如您所見,我已將連接超時設置為 0 以等待連接可用,並將最大池大小設置為 500 b/c 我想確保池對於我的多執行緒服務來說不會太小。該錯誤通常僅在服務啟動並且存在等待處理的報告隊列時出現。

所以很明顯,首先要做的是尋找洩漏的連接。必須有沒有關閉的連接導致池填滿,對吧?不 - 看起來游泳池永遠不會填滿。

在過去的幾個小時裡,我一直在伺服器上執行性能監視器,觀看“.NET Data Provider for SqlServer”,而 NumberOfPooledConnections 從未超過 20 左右。我還在 SQL 伺服器上執行 perfmon,觀看“SQLServer:General Statistics”,並且 UserConnections 永遠不會超過 50。在此期間,我通過手動重新啟動服務導致此錯誤被報告 2 或 3 次。

我還能尋找什麼?還有什麼會導致這個錯誤?完整的錯誤資訊是:

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.
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()

謝謝,斯蒂芬

這是已知的錯誤,如此處所示

Microsoft 於 2008 年 8 月 15 日上午 11:31 發布 感謝您的回饋。該修復程序已送出到下一個主要 .Net 版本的源分支。

引用自:https://stackoverflow.com/questions/6206998