一、數據庫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。
二、數據庫Connection Pool連接池的注意事項
最小連接數:
是數據庫一直保持的數據庫連接數,所以如果應用程序對數據庫連接的使用量不大,將有大量的數據庫資源被浪費。
初始化連接數:
連接池啟動時創建的初始化數據庫連接數量。
最大連接數:
是連接池能申請的最大連接數,如果數據庫連接請求超過此數,后面的數據庫連接請求被加入到等待隊列中。
最大等待時間:
當沒有可用連接時,連接池等待連接被歸還的最大時間,超過時間則拋出異常,可設置參數為0或者負數使得無限等待
注1:在DBCP連接池的配置中,還有一個maxIdle的屬性,表示最大空閑連接數,超過的空閑連接將被釋放,默認值為8。
對應的該屬性在Druid連接池已不再使用,配置了也沒有效果,c3p0連接池則沒有對應的屬性。
注2:數據庫連接池在初始化的時候會創建initialSize個連接,當有數據庫操作時,會從池中取出一個連接。如果當前池中正在使用的連接數等 於maxActive,則會等待一段時間,等待其他操作釋放掉某一個連接,如果這個等待時間超過了maxWait,則會報錯;如果當前正在使用的連接數沒 有達到maxActive,則判斷當前是否空閑連接,如果有則直接使用空閑連接,如果沒有則新建立一個連接。
在連接使用完畢后,不是將其物理連接關閉,而 是將其放入池中等待其他操作復用。
注3:連接有效性檢測設置:
連接池內部有機制判斷,如果當前的總的連接數少於miniIdle,則會建立新的空閑連接,以保證連接數得到miniIdle。如果當前連接池中某 個連接在空閑了timeBetweenEvictionRunsMillis時間后任然沒有使用,則被物理性的關閉掉。有些數據庫連接的時候有超時限制 (mysql連接在8小時后斷開),或者由於網絡中斷等原因,連接池的連接會出現失效的情況,這時候設置一個testWhileIdle參數為true, 可以保證連接池內部定時檢測連接的可用性,不可用的連接會被拋棄或者重建,最大情況的保證從連接池中得到的Connection對象是可用的。
當然,為了 保證絕對的可用性,你也可以使用testOnBorrow為true(即在獲取Connection對象時檢測其可用性),不過這樣會影響性能。
注4:超時連接關閉設置:
removeAbandoned參數,用來檢測到當前使用的連接是否發生了連接泄露,所以在代碼內部就假定如果一個連接建立連接的時間很長,則將其認定為泄露,繼而強制將其關閉掉。
注意:如果在某些負載比較大的系統中將maxIdel設置過小時,很可能會出現連接關閉的同時新連接馬上打開的情況.這是由於關閉連接的線程比打開的快導致的.所以,對於這種系統中,maxIdle的設定值是不同的但是通常首選默認值。
對應的該屬性在Druid連接池已不再使用,配置了也沒有效果,c3p0連接池則沒有對應的屬性。
三、查看線程池占用數量
select * from sysprocesses where dbid= db_id('數據庫名')
四、max pool size的配置相關 常見的錯誤
異常詳細信息
System.InvalidOperationException: 超時時間已到。超時時間已到,但是尚未從池中獲取連接。出現這種情況可能是因為所有池連接均在使用,並且達到了最大池大小。
問題描述
我們獲取連接超過連接池最大值時產生如上異常。通常連接池最大值為100。當我們獲取連接超過最大值時,等待連接池返回連接而超時,這樣將拋出如上異常