天天看點

前兩天做項目遇到了sqlserver最大連接配接數 Max Pool Size 的問題

前言:出現這種問題使因為程式對connection的回收出現了問題,是因為你的代碼出出現了過多new connection(),這種情況還是你的代碼問題,如果不想把問題歸根于程式,那你就可以改變config連接配接字元串.

在sqlserver中檢視連結的Sql

select * from sysprocesses where dbid= db_id('資料庫名')      

如果在項目中未指明Connectionstring的max pool 的大小,預設是100, 理論最大為32767,如果項目對這個資料庫的連結超過了最大限制,則會讓後面的連結進行等待,等待時間為15s.

說明:也就是在connectionString中如果未指定max pool size的值,則max pool size=100,當通路人員同時連接配接資料庫的數量為101人時,則等待SqlConnection.ConnectionTimeout設定的時間(預設是15 秒)後,還是沒有可用的Connection則會出現上面的錯誤。

但如果超過了這個時間則會報錯,報錯詳情如下:

中文錯誤:

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

英文錯誤:

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. 

解決辦法:

1.在通路資料庫的頁面上使用資料緩存,如果頁面的資料不是經常更新(幾分鐘更新一次)的話,使用Cache對象可以不用通路資料庫而使用緩存中的内容,那麼可以大大減少連接配接數量。           

2.可以在WEB.config 裡面修改連接配接字元串中的Max Pool Size = N;來動态擴大連接配接池中的連接配接最大數量。

<add key="data" value="server=192.168.1.123; Port=3336; uid=root; pwd=root;database=Userdata;pooling=true;min pool size=5;max pool size=512;connect timeout = 20; "/>      

資料庫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。