写点什么

Druid 连接池源码阅读 06

作者:石小天
  • 2022 年 5 月 17 日
  • 本文字数:943 字

    阅读完需:约 3 分钟

官方文档

简介

在 Druid-1.0.27 之前的版本,DruidDataSource 建议使用 TestWhileIdle 来保证连接的有效性,但仍有很多场景需要对连接进行保活处理。在 1.0.28 版本之后,新加入 keepAlive 配置,缺省关闭。使用 keepAlive 功能,建议使用最新版本,比如 1.1.21 或者更高版本

打开 KeepAlive 之后的效果

  1. 初始化连接池时会填充到 minIdle 数量。

  2. 连接池中的 minIdle 数量以内的连接,空闲时间超过 minEvictableIdleTimeMillis,则会执行 keepAlive 操作。

  3. 当网络断开等原因产生的由 ExceptionSorter 检测出来的死连接被清除后,自动补充连接到 minIdle 数量。

配置方法

通过 JVM 启动参数配置

-Ddruid.keepAlive=true

通过 Spring 配置

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">     <property name="keepAlive" value="true" /> </bean>

通过 Spring 配置 connectionProperties

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">     <property name="connectionProperties" value="keepAlive=true" /> </bean>

源码解读

  • 在 DruidDataSource 类中找到 keepAlive 属性

private volatile boolean                 keepAlive                 = false;
复制代码
  • keepAlive 属性只有一个地方可以修改,即

    public void setKeepAlive(boolean keepAlive) {        this.keepAlive = keepAlive;    }
复制代码
  • 查看 setKeepAlive 的调用为 configFromPropety 方法,太长了就不全部贴出来了,另外这个方法名貌似写错了

    public void configFromPropety(Properties properties){      //省略部分代码              {            Boolean value = getBoolean(properties, "druid.keepAlive");            if (value != null) {                this.setKeepAlive(value);            }        }      //省略部分代码      
}
复制代码
  • 疑问:

  • 代码一块一个大括号是为了可读性?

  • 这里发现了一个拼写错误,秦老师提议提一个 PR

  • 因为之前对开源项目了解较少,不知道怎么提所以先百度了一下

    按照流程修改代码、提交 PR 后目前卡住了,跟邮箱有关,可能自己之前注册了另外的 GitHub 账户

    https://github.com/alibaba/druid/pull/4784

  • 明天再排查一下问题,争取在开源系统学习中迈出艰难的第一步

用户头像

石小天

关注

还未添加个人签名 2018.11.07 加入

还未添加个人简介

评论

发布
暂无评论
Druid 连接池源码阅读 06_石小天_InfoQ写作社区