1. 程式人生 > >數據庫連接池問題 Max Pool Size

數據庫連接池問題 Max Pool Size

原因 all 解決方案 緩存 信息 原創文章 建議 執行 pen

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

說明: 執行當前 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();
---------------------
作者:翠花琳
來源:CSDN
原文:https://blog.csdn.net/chensirbbk/article/details/6225268
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

數據庫連接池問題 Max Pool Size