asp.net連接數據庫超時的解決辦法


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

經過幾天辛苦寫的代碼,終於實現了功能豐富的查詢功能,但是使用的過程中,卻經常出現上面的錯誤,百思不得其解。寫代碼的時候就擔心因為功能復雜,效率會很低。

解決方案一

我想原因可能是並發操作。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();

 

:error connecting: 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

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

問題描述:我們獲取連接超過連接池最大值時產生如上異常。通常連接池最大值為100。當我們獲取連接超過最大值時,ADO.NET等待連接池返回連接而超時,這樣將拋出如上異常

產生這樣的問題: 連接數大於 N  並且超出設置的時間(所有連接池中的連接都在用,並且等待的時間超時)
解決辦法:1首先要做的是在我們使用連接后立即關閉連接 

2 其次我們可以通過連接字符串中的Max Pool Size = N;來動態擴大連接池中的連接最大數量。

3 更改連接時間 connect timeout=N

首先要保證所有的 connection 連接之后 都要手動的關閉, 特別是DataReader(

一個connection對象只能打開一個DataReader對象,在該datareader對象關閉之前,無法打開其他的datareader對象,知道該datareader 對象調用close 方法為止)
更改 連接數量和連接時間 根據實際情況而定
為什么會出現這樣的問題呢?
就是比如買票一樣,五個窗口同時創建,每個人都有自己的等待時間.假如五個創建,占用一個.還有四個空閑. 占用五個.剩下的人需要等待.但是 可能等待的時間很長.這些人都會不耐煩(超出規定時間)的走了.出現異常
 

正規的解釋

- Connection Pool 如何工作的?(摘抄自(http://www.cnblogs.com/qqflying/archive/2012/02/13/2349583.html))

首 先當一個程序執行Connection.open()時候,ADO.net就需要判斷,此連接是否支持Connection Pool (Pooling 默認為True),如果指定為False, ADO.net就與數據庫之間創建一個連接(為了避免混淆,所有數據庫中的連接,都使用”連接”描述),然后返回給程序。

如果指定為 True,ADO.net就會根據ConnectString創建一個Connection Pool,然后向Connection Pool中填充Connection(所有.net程序中的連接,都使用”Connection”描述)。填充多少個Connection由Min Pool Size (默認為0)屬性來決定。例如如果指定為5,則ADO.net會一次與SQL數據庫之間打開5個連接,然后將4個Connection,保存在 Connection Pool中,1個Connection返回給程序。

當程序執行到Connection.close() 的時候。如果Pooling 為True,ADO.net 就把當前的Connection放到Connection Pool並且保持與數據庫之間的連接。

同 時還會判斷Connection Lifetime(默認為0)屬性,0代表無限大,如果Connection存在的時間超過了Connection LifeTime,ADO.net就會關閉的Connection同時斷開與數據庫的連接,而不是重新保存到Connection Pool中。

(這個設置主要用於群集的SQL 數據庫中,達到負載平衡的目的)。如果Pooling指定為False,則直接斷開與數據庫之間的連接。

然后當下一次Connection.Open() 執行的時候,ADO.Net就會判斷新的ConnectionString與之前保存在Connection Pool中的Connection的connectionString是否一致。

(ADO.Net 會將ConnectionString轉成二進制流,所 以也就是說,新的ConnectionString與保存在Connection Pool中的Connection的ConnectionString必須完全一致,即使多加了一個空格,或是修改了Connection String中某些屬性的次序都會讓ADO.Net認為這是一個新的連接,而從新創建一個新的連接。所以如果您使用的UserID,Password的認 證方式,修改了Password也會導致一個Connection,如果使用的是SQL的集成認證,就需要保存兩個連接使用的是同一個)。

然 后 ADO.net需要判斷當前的Connection Pool中是否有可以使用的Connection(沒有被其他程序所占用),如果沒有的話,ADO.net就需要判斷ConnectionString設 置的Max Pool Size (默認為100),如果Connection Pool中的所有Connection沒有達到Max Pool Size,ADO.net則會再次連接數據庫,創建一個連接,然后將Connection返回給程序。

如果已經達到了 MaxPoolSize,ADO.net就不會再次創建任何新的連接,而是等待Connection Pool中被其他程序所占用的Connection釋放,這個等待時間受SqlConnection.ConnectionTimeout(默認是15 秒)限制,也就是說如果時間超過了15秒,SqlConnection就會拋出超時錯誤(所以有時候如果SqlConnection.open()方法拋 出超時錯誤,一個可能的原因就是沒有及時將之前的Connnection關閉,同時Connection Pool數量達到了MaxPoolSize。)


免責聲明!

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



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