聊聊druid的源码的几个疑问

LogicRhapsody
• 阅读 286

本文主要聊一聊druid源码的几个疑问

asyncCloseConnectionEnable

druid-1.2.11-sources.jar!/com/alibaba/druid/pool/DruidPooledConnection.java

    public void close() throws SQLException {
        if (this.disable) {
            return;
        }

        DruidConnectionHolder holder = this.holder;
        if (holder == null) {
            if (dupCloseLogEnable) {
                LOG.error("dup close");
            }
            return;
        }

        DruidAbstractDataSource dataSource = holder.getDataSource();
        boolean isSameThread = this.getOwnerThread() == Thread.currentThread();

        if (!isSameThread) {
            dataSource.setAsyncCloseConnectionEnable(true);
        }

        if (dataSource.isAsyncCloseConnectionEnable()) {
            syncClose();
            return;
        }

        //......
    }    
DruidPooledConnection的close方法会判断dataSource.isAsyncCloseConnectionEnable(),但是奇怪的是为true的话,执行的却是syncClose方法

numTestsPerEvictionRun

druid-1.2.11-sources.jar!/com/alibaba/druid/pool/DruidAbstractDataSource.java

    protected volatile int numTestsPerEvictionRun = DEFAULT_NUM_TESTS_PER_EVICTION_RUN;

    public static final int DEFAULT_NUM_TESTS_PER_EVICTION_RUN = 3;

    public int getNumTestsPerEvictionRun() {
        return numTestsPerEvictionRun;
    }

    /**
     * @param numTestsPerEvictionRun
     */
    @Deprecated
    public void setNumTestsPerEvictionRun(int numTestsPerEvictionRun) {
        this.numTestsPerEvictionRun = numTestsPerEvictionRun;
    }
DruidAbstractDataSource定义了numTestsPerEvictionRun属性,不过看set方法标记为废弃了,搜了一下代码,实际没有使用到

timeBetweenEvictionRunsMillis

druid-1.2.11-sources.jar!/com/alibaba/druid/pool/DruidAbstractDataSource.java

protected volatile long timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;

public static final long DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS = 60 * 1000L;
DruidAbstractDataSource定义了timeBetweenEvictionRunsMillis,但是这个却是在getConnectionDirect的时候使用

druid-1.2.11-sources.jar!/com/alibaba/druid/pool/DruidDataSource.java

    public DruidPooledConnection getConnectionDirect(long maxWaitMillis) throws SQLException {
        for (; ; ) {
            // get connection
            if (testOnBorrow) {
                // testConnectionInternal
            } else {
                if (testWhileIdle) {
                    long idleMillis = currentTimeMillis - lastActiveTimeMillis;

                    long timeBetweenEvictionRunsMillis = this.timeBetweenEvictionRunsMillis;

                    if (timeBetweenEvictionRunsMillis <= 0) {
                        timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
                    }
                    if (idleMillis >= timeBetweenEvictionRunsMillis
                            || idleMillis < 0 // unexcepted branch
                    ) {
                        boolean validate = testConnectionInternal(poolableConnection.holder, poolableConnection.conn);
                        if (!validate) {
                            if (LOG.isDebugEnabled()) {
                                LOG.debug("skip not validate connection.");
                            }

                            discardConnection(poolableConnection.holder);
                            continue;
                        }
                    }
                }
            }

            //......
        }

    }
这里用idleMillis去跟timeBetweenEvictionRunsMillis比较,似乎timeBetweenEvictionRunsMillis变量的命名不符合语义,不过它真正的用途是在DestroyConnectionThread里头,在那里才符合它命名的语义

小结

整体代码看下来感觉跟commons-pool相比,druid代码的实现感觉有点粗糙,抽象层级不够高,代码充斥大量统计标记、状态位的处理,维护起来得很小心。另外还有如下几个:

  • DruidPooledConnection的close方法会判断dataSource.isAsyncCloseConnectionEnable(),但是奇怪的是为true的话,执行的却是syncClose方法
  • DruidAbstractDataSource定义了numTestsPerEvictionRun属性,不过看set方法标记为废弃了,搜了一下代码,实际没有使用到
  • DruidAbstractDataSource定义了timeBetweenEvictionRunsMillis,但是这个却是在getConnectionDirect的时候使用,用idleMillis去跟timeBetweenEvictionRunsMillis比较,似乎timeBetweenEvictionRunsMillis变量的命名不符合语义,不过它真正的用途是在DestroyConnectionThread里头,在那里才符合它命名的语义
  • DruidDataSource配置属性列表这里的信息已经过时了也没有纠正过来,比如testOnBorrow现在默认是false
  • 虽然提供了stat页面,但是微服务之后,这项功能基本也没啥用了,一般需要通过metrics集成起来

doc

点赞
收藏
评论区
推荐文章
Easter79 Easter79
4年前
spring使用jetty+jndi配置druid数据源
maven项目pom.xml配置1、配置druid的jar依赖:<dependency<groupIdcom.alibaba</groupId<artifactIddruid</artifac
Stella981 Stella981
4年前
SpringBoot权限管理开发实战3
1.修改pom.xml,添加Druid依赖<dependency<groupIdcom.alibaba</groupId<artifactIddruidspringbootstarter</artifactId<v
Stella981 Stella981
4年前
Druid数据库连接池 实现数据库账号密码加密
jar包版本:druid1.0.15.jar1\.加密,用以下命令将用户名和密码加密cmd命令行执行javacpdruid1.0.15.jarcom.alibaba.druid.filter.config.ConfigTools加密串得到密文2.用户名解密:packag
Stella981 Stella981
4年前
Druid时序数据库升级流程
目前Druid集群版本为0.11.0,新版本0.12.1已支持DruidSQL和Redis,考虑到Druid新特性以及性能的提升,因此需要将Druid从0.11.0版本升级到0.12.1版本,下面将对Druid升级步骤做详细的介绍,升级时请严格按照此步骤进行升级,以免出现一些不可预知的问题。1\.Druid升级包Dru
Stella981 Stella981
4年前
Kylin、Druid、ClickHouse 核心技术对比
文章作者:吴建超内容来源:jackywoo.cn导读:Kylin、Druid、ClickHouse是目前主流的OLAP引擎,本文尝试从数据模型和索引结构两个角度,分析这几个引擎的核心技术,并做简单对比。在阅读本文之前希望能对Kylin、Druid、ClickHouse有所理解。01Kylin数据模型
Easter79 Easter79
4年前
SpringBoot权限管理开发实战3
1.修改pom.xml,添加Druid依赖<dependency<groupIdcom.alibaba</groupId<artifactIddruidspringbootstarter</artifactId<v
Wesley13 Wesley13
4年前
Java 学习笔记 三
一、Druid的简单使用1try{2//1.创建Druid数据源对象3DruidDataSourcedataSourcenewDruidDataSource();45//2.设置数据库连接信息6
Stella981 Stella981
4年前
SpringBoot2 学习 集成Druid配置
Mavenspring.datasource.druid.webstatfilter.principalsessionnamesession_name测试http://localhost:9081/mixmall/druid/index.html————————————————版权
Stella981 Stella981
4年前
Druid Monitor开启登录界面
<!druid<filter<filternamedruidWebStatFilter</filtername<filterclasscom.alibaba.druid.support.http.WebStatFilter</filterclass
Stella981 Stella981
4年前
Spring4.0 + druid 配置动态配置数据源以及多数据源切换功能实现
数据源连接池使用druid其他的数据源基本原理相同spring中配置默认数据源连接池如下:<!数据源配置,使用BoneCP数据库连接池   <beanid"dataSourceOne"class"com.alibaba.druid.pool.DruidDataSource"initmethod"
Easter79 Easter79
4年前
SpringBoot2 学习 集成Druid配置
Mavenspring.datasource.druid.webstatfilter.principalsessionnamesession_name测试http://localhost:9081/mixmall/druid/index.html————————————————版权
LogicRhapsody
LogicRhapsody
Lv1
四月清和雨乍晴,南山当户转分明。更无柳絮因风起,惟有葵花向日倾。
文章
5
粉丝
0
获赞
0