溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

DBCP連接池介紹

發(fā)布時(shí)間:2020-07-12 03:59:53 來源:網(wǎng)絡(luò) 閱讀:6724 作者:羅大俠WY 欄目:數(shù)據(jù)庫
# 初始化連接:連接池啟動(dòng)時(shí)創(chuàng)建的初始化連接數(shù)量
initialSize=1
# 最小空閑連接:連接池中容許保持空閑狀態(tài)的最小連接數(shù)量,低于這個(gè)數(shù)量將創(chuàng)建新的連接,如果設(shè)置為0則不創(chuàng)建
minIdle=1
# 最大空閑連接:連接池中容許保持空閑狀態(tài)的最大連接數(shù)量,超過的空閑連接將被釋放,如果設(shè)置為負(fù)數(shù)表示不限制
maxIdle=2
# 最大活動(dòng)連接:連接池在同一時(shí)間能夠分配的最大活動(dòng)連接的數(shù)量,如果設(shè)置為非正數(shù)則表示不限制
maxActive=3
# 借出連接時(shí)不要測(cè)試,否則很影響性能  
testOnBorrow=false
# 指明連接是否被空閑連接回收器(如果有)進(jìn)行檢驗(yàn).如果檢測(cè)失敗,則連接將被從池中去除.  
testWhileIdle=true
# 每X秒運(yùn)行一次空閑連接回收器
timeBetweenEvictionRunsMillis=30000
# 在校驗(yàn)線程完成校驗(yàn)時(shí)會(huì)移除被遺漏的鏈接
removeAbandonedOnMaintenance=true
# 查詢校驗(yàn)
validationQuery=SELECT 1

-----------------------------

DBCP連接池的自我檢測(cè)

-----------------------------

默認(rèn)配置的DBCP連接池,是不對(duì)池中的連接做測(cè)試的,有時(shí)連接已斷開了,但DBCP連接池不知道,還以為連接是好的呢。

應(yīng)用從池中取出這樣的連接訪問數(shù)據(jù)庫一定會(huì)報(bào)錯(cuò)。這也是好多人不喜歡DBCP的原因。

 

問題例一:

MySQL8小時(shí)問題,Mysql服務(wù)器默認(rèn)連接的“wait_timeout”是8小時(shí),也就是說一個(gè)connection空閑超過8個(gè)小時(shí),Mysql將自動(dòng)斷開該 connection。

但是DBCP連接池并不知道連接已經(jīng)斷開了,如果程序正巧使用到這個(gè)已經(jīng)斷開的連接,程序就會(huì)報(bào)錯(cuò)誤。

 

問題例二:

    以前還使用Sybase數(shù)據(jù)庫,由于某種原因,數(shù)據(jù)庫死了后重啟、或斷網(wǎng)后恢復(fù)。

    等了約10分鐘后,DBCP連接池中的連接還都是不能使用的(斷開的),訪問數(shù)據(jù)應(yīng)用一直報(bào)錯(cuò),最后只能重啟Tomcat問題才解決 。

 

解決方案:

    方案1、定時(shí)對(duì)連接做測(cè)試,測(cè)試失敗就關(guān)閉連接。

    方案2、控制連接的空閑時(shí)間達(dá)到N分鐘,就關(guān)閉連接,(然后可再新建連接)。

    以上兩個(gè)方案使用任意一個(gè)就可以解決以述兩類問題。如果只使用方案2,建議 N <= 5分鐘。連接斷開后最多5分鐘后可恢復(fù)。

    也可混合使用兩個(gè)方案,建議 N = 30分鐘。

    

    下面就是DBCP連接池,同時(shí)使用了以上兩個(gè)方案的配置配置

    validationQuery = "SELECT 1"  驗(yàn)證連接是否可用,使用的SQL語句

    testWhileIdle = "true"      指明連接是否被空閑連接回收器(如果有)進(jìn)行檢驗(yàn).如果檢測(cè)失敗,則連接將被從池中去除.

    testOnBorrow = "false"   借出連接時(shí)不要測(cè)試,否則很影響性能



-----------------------------

DBCP連接池配置參數(shù)注意事項(xiàng)   

-----------------------------

maxIdle值與maxActive值應(yīng)配置的接近。

因?yàn)?,?dāng)連接數(shù)超過maxIdle值后,剛剛使用完的連接(剛剛空閑下來)會(huì)立即被銷毀。而不是我想要的空閑M秒后再銷毀起一個(gè)緩沖作用。這一點(diǎn)DBCP做的可能與你想像的不一樣。

若maxIdle應(yīng)與maxActive相差較大,在高負(fù)載的系統(tǒng)中會(huì)導(dǎo)致頻繁的創(chuàng)建、銷毀連接,連接數(shù)在maxIdle與maxActive間快速頻繁波動(dòng),這不是我想要的。

高負(fù)載的系統(tǒng)的maxIdle值可以設(shè)置為與maxActive相同或設(shè)置為-1(-1表示不限制),讓連接數(shù)量在minIdle與maxIdle間緩沖慢速波動(dòng)。

 

timeBetweenEvictionRunsMillis建議設(shè)置值

initialSize="5",會(huì)在tomcat一啟動(dòng)時(shí),創(chuàng)建5條連接,效果很理想。

但同時(shí)我們還配置了minIdle="10",也就是說,最少要保持10條連接,那現(xiàn)在只有5條連接,哪什么時(shí)候再創(chuàng)建少的5條連接呢?

1、等業(yè)務(wù)壓力上來了, DBCP就會(huì)創(chuàng)建新的連接。

2、配置timeBetweenEvictionRunsMillis=“時(shí)間”,DBCP會(huì)啟用獨(dú)立的工作線程定時(shí)檢查,補(bǔ)上少的5條連接。銷毀多余的連接也是同理。


------------------------------

連接銷毀的邏輯

------------------------------

DBCP的連接數(shù)會(huì)在  0 - minIdle - maxIdle - maxActive  之間變化。變化的邏輯描述如下:

 

默認(rèn)未配置initialSize(默認(rèn)值是0)和timeBetweenEvictionRunsMillis參數(shù)時(shí),剛啟動(dòng)tomcat時(shí),連接數(shù)是0。當(dāng)應(yīng)用有一個(gè)并發(fā)訪問數(shù)據(jù)庫時(shí)DBCP創(chuàng)建一個(gè)連接。

目前連接數(shù)量還未達(dá)到minIdle,但DBCP也不自動(dòng)創(chuàng)建新連接已使數(shù)量達(dá)到minIdle數(shù)量(沒有一個(gè)獨(dú)立的工作線程來檢查和創(chuàng)建)。

隨著應(yīng)用并發(fā)訪問數(shù)據(jù)庫的增多,連接數(shù)也增多,但都與minIdle值無關(guān),很快minIdle被超越,minIdle值一點(diǎn)用都沒有。

直到連接的數(shù)量達(dá)到maxIdle值,這時(shí)的連接都是只增不減的。 再繼續(xù)發(fā)展,連接數(shù)再增多并超過maxIdle時(shí),使用完的連接(剛剛空閑下來的)會(huì)立即關(guān)閉,總體連接的數(shù)量穩(wěn)定在maxIdle但不會(huì)超過maxIdle。

但活動(dòng)連接(在使用中的連接)可能數(shù)量上瞬間超過maxIdle,但永遠(yuǎn)不會(huì)超過maxActive。

這時(shí)如果應(yīng)用業(yè)務(wù)壓力小了,訪問數(shù)據(jù)庫的并發(fā)少了,連接數(shù)也不會(huì)減少(沒有一個(gè)獨(dú)立的線程來檢查和銷毀),將保持在maxIdle的數(shù)量。

默認(rèn)未配置initialSize(默認(rèn)值是0),但配置了timeBetweenEvictionRunsMillis=“30000”(30秒)參數(shù)時(shí),剛啟動(dòng)tomcat時(shí),連接數(shù)是0。馬上應(yīng)用有一個(gè)并發(fā)訪問數(shù)據(jù)庫時(shí)DBCP創(chuàng)建一個(gè)連接。

目前連接數(shù)量還未達(dá)到minIdle,每30秒DBCP的工作線程檢查連接數(shù)是否少于minIdle數(shù)量,若少于就創(chuàng)建新連接直到達(dá)到minIdle數(shù)量。

隨著應(yīng)用并發(fā)訪問數(shù)據(jù)庫的增多,連接數(shù)也增多,直到達(dá)到maxIdle值。這期間每30秒DBCP的工作線程檢查連接是否空閑了30分鐘,若是就銷毀。但此時(shí)是業(yè)務(wù)的高峰期,是不會(huì)有長(zhǎng)達(dá)30分鐘的空閑連接的,工作線程查了也是白查,但它在工作。到這里連接數(shù)量一直是呈現(xiàn)增長(zhǎng)的趨勢(shì)。

當(dāng)連接數(shù)再增多超過maxIdle時(shí),使用完的連接(剛剛空閑下來)會(huì)立即關(guān)閉,總體連接的數(shù)量穩(wěn)定在maxIdle。停止了增長(zhǎng)的趨勢(shì)。但活動(dòng)連接(在使用中的連接)可能數(shù)量上瞬間超過maxIdle,但永遠(yuǎn)不會(huì)超過maxActive。

這時(shí)如果應(yīng)用業(yè)務(wù)壓力小了,訪問數(shù)據(jù)庫的并發(fā)少了,每30秒DBCP的工作線程檢查連接(默認(rèn)每次查3條)是否空閑達(dá)到30分鐘(這是默認(rèn)值),若連接空閑達(dá)到30分鐘,就銷毀連接。這時(shí)連接數(shù)減少了,呈下降趨勢(shì),將從maxIdle走向minIdle。當(dāng)小于minIdle值時(shí),則DBCP創(chuàng)建新連接已使數(shù)量穩(wěn)定在minIdle,并進(jìn)行著新老更替。

配置initialSize=“10”時(shí),tomcat一啟動(dòng)就創(chuàng)建10條連接。其它同上。

minIdle要與timeBetweenEvictionRunsMillis配合使用才有用,單獨(dú)使用minIdle不會(huì)起作用。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI