Druid配置參數(shù)詳解-keepAlive
Druid是一個(gè)由阿里開源的數(shù)據(jù)庫(kù)連接池,Druid的配置非常豐富,但是設(shè)置不當(dāng)會(huì)對(duì)生產(chǎn)環(huán)境造成嚴(yán)重影響,網(wǎng)上Druid的資料雖多,但大部分都是互相復(fù)制粘貼,有很多不準(zhǔn)確甚至完全錯(cuò)誤的描述,Druid已經(jīng)開源很久,而且作者WenShao的工作重心也已經(jīng)不在Druid上,有些功能估計(jì)他自己都不太了解了。本系列將從源代碼的角度分析Druid目前的最新版本(1.1.21)各個(gè)常用的配置項(xiàng)的具體含義以及是怎么起作用的。
畫外音:目前Druid在開源中國(guó)舉辦的2019年度最受歡迎中國(guó)開源軟件中排名第7名,支持Druid的朋友可以去投票哇。2019年度最受歡迎中國(guó)開源軟件
keepAlive是什么意思?
keepAlive:保持連接的有效性,也就是跟數(shù)據(jù)庫(kù)續(xù)租;
keepAlive什么時(shí)候會(huì)起作用?
當(dāng)連接的空閑時(shí)間大于keepAliveBetweenTimeMillis(默認(rèn)2分鐘),但是小于minEvictableIdleTimeMillis(默認(rèn)30分鐘),Druid會(huì)通過調(diào)用validationQuery保持該連接的有效性。
當(dāng)連接空閑時(shí)間大于minEvictableIdleTimeMillis,Druid會(huì)直接將該連接關(guān)閉,keepAlive會(huì)無效。
keepAlive在代碼中是如何生效的?
在DestroyTask的shrink方法中驗(yàn)證連接是否處于空閑狀態(tài),并判斷是否需要保持該連接
//如果空閑時(shí)間大于minEvictableIdleTimeMillis,則關(guān)閉該連接,keepAlive就會(huì)跳過
if (idleMillis >= minEvictableIdleTimeMillis) {
if (checkTime && i < checkCount) {
evictConnections[evictCount++] = connection;
continue;
} else if (idleMillis > maxEvictableIdleTimeMillis) {
evictConnections[evictCount++] = connection;
continue;
}
}
//如果空閑時(shí)間小于minEvictableIdleTimeMillis,但是大于keepAliveBetweenTimeMillis,則會(huì)保持連接有效性
if (keepAlive && idleMillis >= keepAliveBetweenTimeMillis) {
keepAliveConnections[keepAliveCount++] = connection;
}
//。。。。。。省略部分代碼
if (keepAliveCount > 0) {
// keep order
for (int i = keepAliveCount - 1; i >= 0; --i) {
DruidConnectionHolder holer = keepAliveConnections[i];
Connection connection = holer.getConnection();
holer.incrementKeepAliveCheckCount();
boolean validate = false;
try {//通過調(diào)用validateQuery保持連接的有效性
this.validateConnection(connection);
validate = true;
} catch (Throwable error) {
if (LOG.isDebugEnabled()) {
LOG.debug("keepAliveErr", error);
}
// skip
}
boolean discard = !validate;
if (validate) {
holer.lastKeepTimeMillis = System.currentTimeMillis();
boolean putOk = put(holer, 0L);
if (!putOk) {
discard = true;
}
}
//。。。。。。省略部分代碼
}
}
總結(jié)
- keepAlive是Druid用來保持連接有效性的;
- 只有空閑時(shí)間大于keepAliveBetweenTimeMillis并且小于minEvictableIdleTimeMillis該參數(shù)才會(huì)有用;