已超過連接逾時的設定。在取得集區連接之前超過逾時等待的時間,可能的原因為所有的共用連接已在使用中,並已達共用集區大小的最大值。

「已超過連接逾時的設定。在取得集區連接之前超過逾時等待的時間,可能的原因為所有的共用連接已在使用中,並已達共用集區大小的最大值。」

這個 Connection Pool 滿了的錯誤訊息在開發系統過程中常常會看到,

只是發生這樣子的錯誤之後,同事常常會問說,真的是連接數有超過預設值的 100 個嗎?

我們可以透過「效能監視器」來查看某個 Web AP 中使用 Pools 的狀況,如下,

開啟「效能監視器」或是在執行輸入「perfmon」,

然後可以加入以下幾項計數器,說明如下,

NumberOfInactiveConnectionPools : 最近未有任何活動且正等候處置 (Dispose) 的非現用連接集區數目。
NumberOfPooledConnections : 正由連接共用基礎結構所管理的現用連接的數目。(Pool中的連線數)
NumberOfActiveConnections : 目前使用中的現用連接的數目。
NumberOfFreeConnections : 連接集區中可用的連接數目。

如果想要透過程式來看的話,則可以參考「ADO.NET 中的效能計數器」的範例,

在查看計數器的數值中,如果發現 NumberOfActiveConnections 一直大於 0 的話,
表示某個 Connection 正在被使用,可以檢查是否有 SQL Run 後久,或是 Connection 開了沒有關。
像筆者測試 Opne 一堆 Connection 並沒有 Close 它,圖就像下面的樣子,

如果一般使用 using …. 而且 SQL 又快的話,會發現 NumberOfActiveConnections 值是 0 哦!

那如果發現 NumberOfActiveConnections 值是 0,而系統又會發生 Pool 滿了狀況,那就有可能那個時間點,
同時間真的有一堆的 Request ,可以使用 Cache 或是加大 Pool 可用的 Connection 數量哦!

另外,筆者在研究這個問題時發現 Connection 有2個 Clear Pool 的 Method,
一個是 ClearAllPools() ,另一個是 ClearPool(你的Connection) 。
他們的目的是將目前這些或是這個 Connection 所屬的 Pool 設定為要 Dispose,
重新要一個新的 Pool 來使用。
所以當程式呼叫  ClearAllPools or ClearPool 後,
可以發現 NumberOfInactiveConnectionPools 計數器的值會後上增加哦!
而 NumberOfPooledConnections 的值是包含 Dispose 的 Pool 及正在使用 Pool 中的 Connection 哦!

測試專案可以從「https://github.com/rainmakerho/AdoConnPoolInfos」 download。

參考資料

ADO.NET 中的效能計數器

作者: 亂馬客

亂馬客 @叡揚資訊 rainmaker_ho@gss.com.tw https://rainmakerho.github.io/ https://www.slideshare.net/rainmakerho

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *