Druid配置參數(shù)詳解-maxEvictableIdleTimeMillis,minEvictableIdleTimeMillis
Druid是一個由阿里開源的數(shù)據(jù)庫連接池,Druid的配置非常豐富钾埂,但是設(shè)置不當(dāng)會對生產(chǎn)環(huán)境造成嚴(yán)重影響浑玛,網(wǎng)上Druid的資料雖多嚼吞,但大部分都是互相復(fù)制粘貼法梯,有很多不準(zhǔn)確甚至完全錯誤的描述厦瓢,Druid已經(jīng)開源很久揍障,而且作者WenShao的工作重心也已經(jīng)不在Druid上脉课,有些功能估計他自己都不太了解了救军。本系列將從源代碼的角度分析Druid目前的最新版本(1.1.21)各個常用的配置項的具體含義以及是怎么起作用的。
畫外音:目前Druid在開源中國舉辦的2019年度最受歡迎中國開源軟件中排名第7名下翎,支持Druid的朋友可以去投票哇缤言。2019年度最受歡迎中國開源軟件
連接池是怎么判斷一條連接是Idle狀態(tài)的?
就是通過這兩個參數(shù)進行判斷的
- minEvictableIdleTimeMillis:最小空閑時間视事,默認30分鐘胆萧,如果連接池中非運行中的連接數(shù)大于minIdle,并且那部分連接的非運行時間大于minEvictableIdleTimeMillis俐东,則連接池會將那部分連接設(shè)置成Idle狀態(tài)并關(guān)閉跌穗;也就是說如果一條連接30分鐘都沒有使用到,并且這種連接的數(shù)量超過了minIdle虏辫,則這些連接就會被關(guān)閉了蚌吸。
- maxEvictableIdleTimeMillis:最大空閑時間,默認7小時砌庄,如果minIdle設(shè)置得比較大羹唠,連接池中的空閑連接數(shù)一直沒有超過minIdle,這時那些空閑連接是不是一直不用關(guān)閉娄昆?當(dāng)然不是佩微,如果連接太久沒用,數(shù)據(jù)庫也會把它關(guān)閉萌焰,這時如果連接池不把這條連接關(guān)閉哺眯,系統(tǒng)就會拿到一條已經(jīng)被數(shù)據(jù)庫關(guān)閉的連接。為了避免這種情況扒俯,Druid會判斷池中的連接如果非運行時間大于maxEvictableIdleTimeMillis奶卓,也會強行把它關(guān)閉一疯,而不用判斷空閑連接數(shù)是否小于minIdle;
這兩參數(shù)是怎么起作用的夺姑?
這兩參數(shù)是在DestroyTask的shrink方法中用來判斷連接是不是應(yīng)該被關(guān)閉的墩邀。
//關(guān)閉條件,空閑時間大于minEvictableIdleTimeMillis盏浙,并且空閑連接大于minIdle磕蒲,
// 其中checkCount為poolingCount - minIdle,即可能被關(guān)閉的連接數(shù)量
//或者空閑時間大于maxEvictableIdleTimeMillis
if (idleMillis >= minEvictableIdleTimeMillis) {
if (checkTime && i < checkCount) {
evictConnections[evictCount++] = connection;
continue;
} else if (idleMillis > maxEvictableIdleTimeMillis) {
evictConnections[evictCount++] = connection;
continue;
}
}
總結(jié)
- minEvictableIdleTimeMillis連接空閑時間大于該值并且池中空閑連接大于minIdle則關(guān)閉該連接
- maxEvictableIdleTimeMillis連接空閑時間大于該值只盹,不管minIdle都關(guān)閉該連接