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,並進行着新老更替。







發佈了101 篇原創文章 · 獲贊 123 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章