1. 程式人生 > >DBCP連線池配置引數詳解

DBCP連線池配置引數詳解

initialSize="10"     

     初始化連線,連線池啟動時建立的初始化連線數量(預設值為0)

maxActive="80"     
     最大活動連線,連線池中可同時連線的最大的連線數(預設值為8)

minIdle="10"     
     最小空閒連線,連線池中最小的空閒的連線數,低於這個數量會被建立新的連線(預設為0,該引數越接近maxIdle,效能越好,因為連線的建立和銷燬,都是需要消耗資源的;但是不能太大,因為在機器很空閒的時候,也會建立低於minidle個數的連線,類似於jvm引數中的Xmn設定)

maxIdle="60"    

 
     最大空閒連線,連線池中最大的空閒的連線數,超過的空閒連線將被釋放,如果設定為負數表示不限制(預設為8個,maxIdle不能設定太小,因為假如在高負載的情況下,連線的開啟時間比關閉的時間快,會引起連線池中idle的個數上升超過maxIdle,而造成頻繁的連線銷燬和建立,類似於jvm引數中的Xmx設定)

maxWait="3000"     
     從池中取連線的最大等待時間,單位ms.當沒有可用連線時,連線池等待連線釋放的最大時間,超過該時間限制會丟擲異常,如果設定-1表示無限等待(預設為無限)

validationQuery = "SELECT 1"     

     驗證使用的SQL語句

testWhileIdle = "true"     
     指明連線是否被空閒連接回收器(如果有)進行檢驗.如果檢測失敗,則連線將被從池中去除.

testOnBorrow = "false"     
     借出連線時不要測試,否則很影響效能。一定要配置,因為它的預設值是true。false表示每次從連線池中取出連線時,不需要執行validationQuery = "SELECT 1" 中的SQL進行測試。若配置為true,對效能有非常大的影響,效能會下降7-10倍。

timeBetweenEvictionRunsMillis = "30000"

     每30秒執行一次空閒連接回收器,配置timeBetweenEvictionRunsMillis = "30000"後,每30秒執行一次空閒連接回收器(獨立執行緒)。並每次檢查3個連線,如果連線空閒時間超過30分鐘就銷燬。銷燬連線後,連線數量就少了,如果小於minIdle數量,就新建連線,維護數量不少於minIdle,過行了新老更替。

minEvictableIdleTimeMillis = "1800000"
     池中的連線空閒30分鐘後被回收

numTestsPerEvictionRun="3"
     在每次空閒連接回收器執行緒(如果有)執行時檢查的連線數量

removeAbandoned="true"
     連線洩漏回收引數,當可用連線數少於3個時才執行

removeAbandonedTimeout="180"
     連線洩漏回收引數,180秒,洩露的連線可以被刪除的超時值

 

注意事項

maxIdle值與maxActive值應配置的接近
     當連線數超過maxIdle值後,剛剛使用完的連線(剛剛空閒下來)會立即被銷燬。而不是想要的空閒M秒後再銷燬起一個緩衝作用。若maxIdle與maxActive相差較大,在高負載的系統中會導致頻繁的建立、銷燬連線,連線數在maxIdle與maxActive間快速頻繁波動,這不是想要的。高負載系統的maxIdle值可以設定為與maxActive相同或設定為-1(-1表示不限制),讓連線數量在minIdle與maxIdle間緩衝慢速波動。

timeBetweenEvictionRunsMillis建議設定值
minIdle要與timeBetweenEvictionRunsMillis配合使用才有用,單獨使用minIdle不會起作用。

initialSize="5",會在tomcat一啟動時,建立5條連線,效果很理想。但同時我們還配置了minIdle="10",也就是說,最少要保持10條連線,那現在只有5條連線,哪什麼時候再建立少的5條連線呢?
     1、等業務壓力上來了, DBCP就會建立新的連線。
     2、配置timeBetweenEvictionRunsMillis=“時間”,DBCP會啟用獨立的工作執行緒定時檢查,補上少的5條連線。銷燬多餘的連線也是同理。

 

 

連線銷燬的邏輯


DBCP的連線數會在initialSize - minIdle - maxIdle - maxActive  之間變化。變化的邏輯描述如下:
    預設未配置initialSize(預設值是0)和timeBetweenEvictionRunsMillis引數時,剛啟動tomcat時,連線數是0。當應用有一個併發訪問資料庫時DBCP建立一個連線。目前連線數量還未達到minIdle,但DBCP也不自動建立新連線已使數量達到minIdle數量(沒有一個獨立的工作執行緒來檢查和建立)。隨著應用併發訪問資料庫的增多,連線數也增多,但都與minIdle值無關,很快minIdle被超越,minIdle值一點用都沒有。直到連線的數量達到maxIdle值,這時的連線都是隻增不減的。 再繼續發展,連線數再增多並超過maxIdle時,使用完的連線(剛剛空閒下來的)會立即關閉,總體連線的數量穩定在maxIdle但不會超過maxIdle。
    但活動連線(在使用中的連線)可能數量上瞬間超過maxIdle,但永遠不會超過maxActive。這時如果應用業務壓力小了,訪問資料庫的併發少了,連線數也不會減少(沒有一個獨立的執行緒來檢查和銷燬),將保持在maxIdle的數量。

    預設未配置initialSize(預設值是0),但配置了timeBetweenEvictionRunsMillis=“30000”(30秒)引數時,剛啟動tomcat時,連線數是0。馬上應用有一個併發訪問資料庫時DBCP建立一個連線。目前連線數量還未達到minIdle,每30秒DBCP的工作執行緒檢查連線數是否少於minIdle數量,若少於就建立新連線直到達到minIdle數量。
    隨著應用併發訪問資料庫的增多,連線數也增多,直到達到maxIdle值。這期間每30秒DBCP的工作執行緒檢查連線是否空閒了30分鐘,若是就銷燬。但此時是業務的高峰期,是不會有長達30分鐘的空閒連線的,工作執行緒查了也是白查,但它在工作。到這裡連線數量一直是呈現增長的趨勢。
    當連線數再增多超過maxIdle時,使用完的連線(剛剛空閒下來)會立即關閉,總體連線的數量穩定在maxIdle。停止了增長的趨勢。但活動連線(在使用中的連線)可能數量上瞬間超過maxIdle,但永遠不會超過maxActive。
     這時如果應用業務壓力小了,訪問資料庫的併發少了,每30秒DBCP的工作執行緒檢查連線(預設每次查3條)是否空閒達到30分鐘(這是預設值),若連線空閒達到30分鐘,就銷燬連線。這時連線數減少了,呈下降趨勢,將從maxIdle走向minIdle。當小於minIdle值時,則DBCP建立新連線已使數量穩定在minIdle,並進行著新老更替。