写点什么

dru 源码阅读(十)Druid keepAlive 参数

  • 2022 年 5 月 19 日
  • 本文字数:1153 字

    阅读完需:约 4 分钟

1、含义

官方解释:连接池中的 minIdle 数量以内的连接,空闲时间超过 minEvictableIdleTimeMillis,则会执行 keepAlive 操作。默认为 false。

说的不是很清楚,初步看起来这个参数会在合适的时候检查连接,保证连接是有效的。

2、源码

可以通过 DruidDataSource.setKeepAlive(true)开启该参数,查看源码,搜索 keepAlive,除了在创建连接时进行判断,主要在 shrink 这个方法中使用。这个方法是在 DestroyTask 线程中,判断连接是否需要被回用的。keepAlive 使用到的代码如下:

if (keepAlive && idleMillis >= keepAliveBetweenTimeMillis) {    keepAliveConnections[keepAliveCount++] = connection;}
复制代码

将空闲时间超过设置的 keepAliveBetweenTimeMillis 参数的连接放入到待检测的池子中。

if (keepAlive && poolingCount + activeCount < minIdle) {                needFill = true;}
复制代码

开启该参数并且现有连接小于 minIdle,需要新建连接。

           for (int i = keepAliveCount - 1; i >= 0; --i) {                DruidConnectionHolder holer = keepAliveConnections[i];                Connection connection = holer.getConnection();                holer.incrementKeepAliveCheckCount();
boolean validate = false; try { 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, true); if (!putOk) { discard = true; } }
if (discard) { try { connection.close(); } catch (Exception e) { // skip }
lock.lock(); try { discardCount++;
if (activeCount + poolingCount <= minIdle) { emptySignal(); } } finally { lock.unlock(); } } }
复制代码

检查连接可用性,不可用就丢弃。

用户头像

还未添加个人签名 2021.05.30 加入

还未添加个人简介

评论

发布
暂无评论
dru源码阅读(十)Druid keepAlive参数_5月月更_爱晒太阳的大白_InfoQ写作社区