Dot-Net
從池中獲取連接之前的超時時間已過 - 但池未滿
我什至討厭提起這個 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 版本的源分支。