解決報錯“超時時間已到。超時時間已到,但是尚未從池中獲取連接”的方案


超時時間已到。超時時間已到,但是尚未從池中獲取連接。出現這種情況可能是因為所有池連接均在使用,並且達到了最大池大小。 

DataReader是獨占連接的,就是說你的程序可能設計上有問題。比如說最大連接設100,假設有100個人同時使用DataReader正在讀取數據庫內容,那么當第101人讀取的時候,連接池中的連接已經沒有了,就會出現上面的錯誤。DataReader是獨占連接的,每個DataReader都要占用一個連接。當然這個情況是偶爾出現的,所以會很長時間出現一次,因為只有同時有超過連接池最大連接數量的並發操作才會發生。而且你加大並發數量只能暫時緩解問題,如果你加大到200個並發連接,如果有201人同時操作怎么辦?你說了你使用Connection對象的Close()方法,這是不行的,因為Close()方法僅僅是關閉連接,但這個連接沒有釋放,還是被這個對象占用,要釋放必須使用Connection的Dispose()方法顯式釋放連接才可以,否則這個對象占用的連接只能等到垃圾收集的情況下才能被釋放。這種情況肯定會出現“超時時間已到”的錯誤。

 

解決方法1:
1 修改幾個關鍵頁面或訪問比較頻繁的數據庫訪問操作,使用DataAdapter和DataSet來獲取數據庫數據,不要使用DataReader。
2 在訪問數據庫的頁面上使用數據緩存,如果頁面的數據不是經常更新(幾分鍾更新一次)的話,使用Cache對象可以不用訪問數據庫而使用緩存中的內容,那么可以大大減少連接數量。
3 修改代碼,把使用Connection對象的地方都在Close()后面調用Dispose()或者實例化對象時使用using關鍵字進行自動釋放。
4 建議對數據庫操作進行大的修改,建立自己的數據庫操作代理類,繼承System.IDisposable接口,強迫釋放資源,這樣就不會出現連接數量不夠的問題了。

 

解決方法2:

改變連接池的大小.在連接字符串的后面加上以下代碼:

Enlist=true;Pooling=true;Max Pool Size=300;Min Pool Size=0;Connection Lifetime=300;user id=sa;packet size=1000

packet size參數取512到32767中的任一整數值


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM