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.
超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
前提:程式已經有close&dispose
可能發生的問題:
這個錯誤通常跟應用程式的兩個地方有關:
- 資料庫連線字串所使用的 connection pool 參數。
- 程式的寫法有問題,導致資料庫連線沒有盡快釋放,以至於連線池爆滿。
此錯誤訊息很容易就可以重現。例如,你可以寫個程式,裡面用一個迴圈不斷開啟新的資料庫連線,但都不要釋放它。很快地,例如開啟 100 個連線之後,就會出現這個錯誤訊息。
引用 https://www.huanlintalk.com/2012/05/net-connection-pool.html
監測效能監視器Connection Pool
https://dotblogs.com.tw/rainmaker/2017/04/26/143316
[code Connection Pool行為]
SQL Connection Pooling 行為觀察
- 1.連線字串要完全相同才能共享 Pool,故要避免動態產生不同連線字串以免搞出一堆 Pool 失去共用資源的意義(術語叫 Pool Fragmentation)
- 2.Pool 最大連線數(Max Pool Size)預設為 100 條
- 3.Pool 連線數達上限時需排隊等待,若逾時將拋出錯誤,預設等待上(Connection Timeout)限為 15 秒
- 4.最低連線數(Min Pool Size)是每個 Pool 維持的基本連線數(低消),預設為 0
- 5.Pool 中的連線若閒置 4-8 分鐘或發生斷線(Severed Connection),將被從 Pool 移除。
https://blog.darkthread.net/blog/sql-conn-pooling-experiment/
[C#] SQL 資料庫 Connection Pool 連線池觀念釐清
https://ithelp.ithome.com.tw/articles/10210068
[觀念]
超时时间已到.错误及Max Pool Size设置
https://www.cnblogs.com/delphinet/archive/2010/09/29/1838494.html
連線池機制
https://www.cnblogs.com/eaglet/archive/2011/10/31/2230197.html
Connection Pool (連線池)
dispose()與close()的區別 及pooling連線池相關
連線池错误的解决方案:
已超過連接逾時的設定。在取得集區連接之前超過逾時等待的時間,可能的原因為所有的共用連接已在使用中,並已達共用集區大小的最大值。
一個是 ClearAllPools() ,另一個是 ClearPool(你的Connection) 。..
💬統整:
釋放連線、釋放連線池連線應該是兩件事,
所以即使已經做到conn.close(); conn.dispose();也可能生連線池過滿的問題
因此我的問題應是出在連線池中的連線並未被重複使用,每次動作都建立新的連線而使連線池過滿。