引言
自己弄了一個小項目——日程管理系統,在初始化日期時,查詢了數據庫,每個日期就會查詢一次數據庫,就導致了這個問題。
問題
出現這種情況可能是因為所有池連接均在使用,並且達到了最大池大小。
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.InvalidOperationException: 超時時間已到。超時時間已到,但是尚未從池中獲取連接。
出現這種情況可能是因為所有池連接均在使用,並且達到了最大池大小。
說明: 執行當前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤信息,以了解有關該錯誤以及代碼中導致錯誤的出處的詳細信息。 異常詳細信息: System.InvalidOperationException: 超時時間已到。超時時間已到,但是尚未從池中獲取連接。出現這種情況可能是因為所有池連接均在使用,並且達到了最大池大小。 這是個老問題了!
如何解決
一、看所有open的連接是否都close了。
二、如果訪問量很大,加上Max Pool Size=512這一句,當然這是要以損失系統性能為代價的! 這樣以后一定可以解決你的問題!
解決方案
解決方案一
我想原因可能是並發操作。DataReader是獨占連接的,就是說你的程序可能設計上有問題。比如說最大連接設100,假設有100個人同時使用 DataReader正在讀取數據庫內容,那么當第101人讀取的時候,連接池中的連接已經沒有了,就會出現上面的錯誤。DataReader是獨占連接 的,每個DataReader都要占用一個連接。當然這個情況是偶爾出現的,所以會很長時間出現一次,因為只有同時有超過連接池最大連接數量的並發操作才會發生。而且你加大並發數量只能暫時緩解問題,如果你加大到200個並發連接,如果有201 人同時操作怎么辦?你說了你使用Connection對象的Close()方法,這是不行的,因為Close()方法僅僅是關閉連接,但這個連接沒有釋放,還是被這個對象占用,要釋放必須使用Connection的Dispose()方法顯式釋放連接才可以,否則這個對象占用的連接只能等到垃圾收集的情 況下才能被釋放。這種情況肯定會出現“超時時間已到”的錯誤。
解決方法
1 修改幾個關鍵頁面或訪問比較頻繁的數據庫訪問操作,使用DataAdapter和DataSet來獲取數據庫數據,不要使用DataReader。
2 在訪問數據庫的頁面上使用數據緩存,如果頁面的數據不是經常更新(幾分鍾更新一次)的話,使用Cache對象可以不用訪問數據庫而使用緩存中的內容,那么可以大大減少連接數量。
3 修改代碼,把使用Connection對象的地方都在Close()后面加上Dispose()調用。
4 建議對數據庫操作進行大的修改,建立自己的數據庫操作代理類,繼承
System.IDisposable接口,強迫釋放資源,這樣就不會出現連接數量不夠的問題了。
解決方案二
解決方法(*)
WEB.config 里面:在數據庫連接加 Max Pool Size = 512;server=local;uid=;pwd=;database=2004;Max Pool Size = 512;">一勞永逸。 解決方案三
估計是連接(Connection)對象沒有Close。倒是不必Dispose,而DataReader用完后應該關閉,但不關閉也沒問題,只是不關閉的話此連接對象就一直不能用,只要你最終關閉了連接對象就不會出問題。 連接對象在Open后的操作都放在try塊中,后面跟一個finally塊:conn.Close();