.net 數據庫鏈接池超時問題

1、數據庫Connection Pool 鏈接池是什麼數據庫

 

每當程序須要讀寫數據庫的時候。Connection.Open()會使用ConnectionString鏈接到數據庫,數據庫會爲程序創建 一個鏈接,而且保持打開狀態,此後程序就可使用T-SQL語句來查詢/更新數據庫。當執行到Connection.Close()後,數據庫就會關閉當 前的鏈接。
 
可是若是個人程序須要不定時的打開和關閉鏈接,(好比說 ASP.Net 或是 Web Service ),例如當Http Request發送到服務器的時候、,咱們須要打開Connection 而後使用Select* from Table 返回一個DataTable/DataSet給客戶端/瀏覽器,而後關閉當前的Connection。那每次都Open/Close Connection 如此的頻繁操做對於整個系統無疑就成了一種浪費。
 
ADO.Net Team就給出了一個比較好地解決方法。將先前的Connection保存起來,當下一次須要打開鏈接的時候就將先前的Connection 交給下一個鏈接。這就是Connection Pool。
 
 
 
2、數據庫Connection Pool鏈接池的運行方式
 
 
 
一、當一個程序執行Connection.open()時候,ADO.net就須要判斷,此鏈接是否支持Connection Pool (Pooling 默認爲True)
 
(1)、若是指定爲False, ADO.net就與數據庫之間建立一個鏈接,而後返回給程序。
 
(2)、若是指定爲 True,ADO.net就會根據ConnectString建立一個Connection Pool,而後向Connection Pool中填充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中。
 
 
三、當下一次Connection.Open() 執行的時候,ADO.Net就會判斷新的ConnectionString與以前保存在Connection Pool中的Connection的connectionString是否一致。
 
 
四、 ADO.net須要判斷當前的Connection Pool中是否有可使用的Connection(沒有被其餘程序所佔用),若是沒有的話,ADO.net就須要判斷ConnectionString設 置的Max Pool Size (默認爲100)
 
(1)、若是Connection Pool中的全部Connection沒有達到Max Pool Size,ADO.net則會再次鏈接數據庫,建立一個鏈接,而後將Connection返回給程序。
 
(2)、若是已經達到了 MaxPoolSize,ADO.net就不會再次建立任何新的鏈接,而是等待Connection Pool中被其餘程序所佔用的Connection釋放,這個等待時間受SqlConnection.ConnectionTimeout(默認是15 秒)限制,也就是說若是時間超過了15秒,SqlConnection就會拋出超時錯誤。
 
 
五、若是有可用的Connection,從Connection Pool 取出的Connection也不是直接就返回給程序,ADO.net還須要檢查ConnectionString的ConnectionReset屬性 (默認爲True)是否須要對Connection 最一次reset。
 
 
 
3、ASP.NET程序對max pool size的配置
 
<add key="data" value="server=192.168.1.123; Port=3306; uid=root; pwd=root;database=data;pooling=true;min pool size=5;max pool size=512;connect timeout = 20; "/> 
 
 
 其中Max Pool Size若是未設置則默認爲100,理論最大值爲32767。最大鏈接數是鏈接池能申請的最大鏈接數,若是數據庫鏈接請求超過此數,後面的數據庫鏈接請求將被加入到等待隊列中,這會影響以後的數據庫操做。在等待隊列中,默認等待與服務器的鏈接的時間爲15秒。
 
 
 
4、查看應用程序池佔用數量
 
select * from sysprocesses where dbid= db_id('數據庫名')
 
 
 
5、max pool size的配置相關 常見的錯誤
 
 
異常詳細信息
 
System.InvalidOperationException: 超時時間已到。超時時間已到,可是還沒有從池中獲取鏈接。出現這種狀況多是由於全部池鏈接均在使用,而且達到了最大池大小。
 
 
問題描述
 
咱們獲取鏈接超過鏈接池最大值時產生如上異常。一般鏈接池最大值爲100。當咱們獲取鏈接超過最大值時,ADO.NET等待鏈接池返回鏈接而超時,這樣將拋出如上異常
 

解決方法         瀏覽器

一、要作的是在咱們使用鏈接後當即關閉鏈接緩存

二、在訪問數據庫的頁面上使用數據緩存,若是頁面的數據不是常常更新(幾分鐘更新一次)的話,使用Cache對象能夠不用訪問數據庫而使用緩存中的內容,那麼能夠大大減小鏈接數量。           服務器

三、能夠在WEB.config 裏面修改鏈接字符串中的Max Pool Size = N;來動態擴大鏈接池中的鏈接最大數量。ui

相關文章
相關標籤/搜索