Druid配置參數(shù)詳解-keepAlive

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ì)有用;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我的肉體很累 靈魂在不停的掙扎 在這空洞狹窄的軀殼里 連呼吸都變得困難起來 這是屬于我的 還是用來囚禁我的 骯臟的...
    共赴地獄閱讀 467評(píng)論 3 4
  • 一個(gè)人要想有所成就,或者有一技之長(zhǎng),就必須吃點(diǎn)苦。對(duì)于一個(gè)年輕人來說,吃苦是一件最不應(yīng)該拒絕的事情。人過于順利的成...
    學(xué)霸角閱讀 325評(píng)論 1 11
  • 在看最強(qiáng)大腦的一次偶然機(jī)會(huì)讓我知道了掃雷的玩法,我很興奮了就下載了玩。記得之前每臺(tái)電腦上都有這個(gè)固定的游戲,每次沒...
    芹Danae閱讀 227評(píng)論 0 0

友情鏈接更多精彩內(nèi)容