Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >聊聊druid的源码的几个疑问

聊聊druid的源码的几个疑问

原创
作者头像
code4it
发布于 2023-10-02 02:14:57
发布于 2023-10-02 02:14:57
24900
代码可运行
举报
文章被收录于专栏:码匠的流水账码匠的流水账
运行总次数:0
代码可运行

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

asyncCloseConnectionEnable

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊聊druid的borrow行为
com/alibaba/druid/pool/DruidDataSource.java
code4it
2023/09/25
3430
聊聊druid连接池的参数配置
druid-1.2.11-sources.jar!/com/alibaba/druid/pool/DruidDataSourceFactory.java
code4it
2023/09/28
1.1K0
Druid数据库连接池支持闲时检测吗?
从很早以前,我维护的一个应用在做数据源主备切换时,经常出现切换后获取连接超时。前些时候,我对这个问题做了深入的分析,并得到一些结论,在这里分享给大家。
zhangheng
2020/07/06
5K0
聊聊druid的DestroyConnectionThread
druid-1.2.11-sources.jar!/com/alibaba/druid/pool/DruidDataSource.java
code4it
2023/09/30
2900
聊聊druid的return行为
com/alibaba/druid/pool/DruidPooledConnection.java
code4it
2023/09/26
2270
Druid源码阅读4-DruidDataSource的getConnection过程
DruidDataSource连接池实现了javaX.sql包中,DataSource接口的全部方法。getConnection也来自于javaX.sql.DataSource接口。 而DruidPooledConnection也实现了接口java.sql.Connection。 这样就能在各种场景中通过这个接口来获取数据库连接。
冬天里的懒猫
2021/11/15
1.5K0
诡异的druid链接池链接断开故障经验总结
最近在陆续做机房升级相关工作,配合DBA对产线数据库链接方式做个调整,将原来直接链接读库的地址切换到统一的读负载均衡的代理 haproxy 上,方便机柜和服务器的搬迁。 切换之后线上时不时的会发生 discard connection 错误,导致程序报 500 错误,但不是每次都必现的。
王清培
2019/03/01
7.5K0
聊聊druid的keepalive机制
com/alibaba/druid/pool/DruidDataSource.java
code4it
2023/10/01
3440
从源码理解Druid连接池原理
在我们平时开发中,使用数据库连接池时使用阿里的Druid连接池已经比较常见了,但是我们在集成到Springboot时似乎非常简单,只需要简单的配置即可使用,那么Druid是怎么加载的呢,本文就从源码层面进行揭秘
Vincent-yuan
2021/11/02
1.9K0
Druid源码阅读1-DruidDataSource数据结构
DruidDataSource是DruidCP最关键的类之一,承载了连接池的启动、关闭、以及连接的获取和管理等功能。 其内部关键的的数据结构如下表:
冬天里的懒猫
2021/11/11
6770
Druid源码阅读1-DruidDataSource数据结构
create connection SQLException, url: jdbc:mysql://192.168.231.144:3306/gulimall_pms?
2022-10-12 21:30:33.820 ERROR 39252 --- [eate-2092870757] com.alibaba.druid.pool.DruidDataSource :
一个风轻云淡
2022/11/15
6580
create connection SQLException, url: jdbc:mysql://192.168.231.144:3306/gulimall_pms?
Druid连接报错的原因分析笔记
在使用druid的时候难免会有一些问题,之前就发现了这个问题。但是作者发现其对业务没有影响,所以打算拖一拖。主要是不影响业务,就会会频繁的报错。今天组内其他同学的业务的报错,然后也没定位到问题,最后反馈了druid连接池报错的问题,也就是上述作者说的对业务影响不大的那个报错,至于同事反映的真正的问题是什么,现在还没有复现。现在还是主要将druid的问题解决了再说吧,druid报错如下。
写一点笔记
2022/08/11
5.3K0
Druid连接报错的原因分析笔记
聊聊druid的handleException
com/alibaba/druid/pool/DruidPooledConnection.java
code4it
2023/09/27
2680
Spring Boot + Spring Cloud 实现权限管理系统 后端篇(七):集成 Druid 数据源
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。通过数据库连接池能明显提高对数据库操作的性能。在Java应用程序开发中,常用的连接池有DBCP、C3P0、Proxool等。
朝雨忆轻尘
2019/06/18
1.1K0
从源码角度看JedisPoolConfig参数配置
Java中使用Jedis作为连接Redis的工具。在使用Jedis的也可以配置JedisPool连接池,JedisPool配置参数大部分是由JedisPoolConfig的对应项来赋值的。本文简单总结几个常用的配置,然后通过源码(版本jedis-3.1.0)的角度让你理解配置这些参数的原理。
全栈程序员站长
2022/07/20
5910
从源码角度看JedisPoolConfig参数配置
Druid学习笔记(四) - 参数配置和SqlUtils分析Sql笔记
一年又过去了,2020年是茫然的一年。没想明白自己以后做什么,焦虑,不安,彷徨。希望2021年自己有所改变。所以凡事都尽自己最大努力去做,少抱怨,多做实事,多帮别人解决问题。真诚的和别人沟通,学会欣赏别人,体谅别人,帮助别人。做一个靠谱、善解人意、易于沟通、不断学习、积极向上的人。但行好事,莫问前程!
写一点笔记
2022/08/11
8130
Druid学习笔记(四) - 参数配置和SqlUtils分析Sql笔记
Spring Boot集成Druid异常discard long time none received connection.
在Spring Boot集成Druid项目中,发现错误日志中频繁的出现如下错误信息:
程序新视界
2021/12/07
10.3K1
对象池 GenericObjectPool 配置参数详解
开始之前,引用一篇《Quartz定时任务框架:原理、应用与实战》,该文详细介绍了Quartz的工作原理、应用场景以及实战经验,能够帮助读者在实际项目中更好地应用Quartz,提升系统的自动化程度和工作效率,有需要的朋友可以研究研究!
huazie
2024/11/25
3430
对象池 GenericObjectPool 配置参数详解
mysql连接池DruidDataSource的使用、配置「建议收藏」
大家好,又见面了,我是你们的朋友全栈君。 记录一下mysql连接池DruidDataSource的常用配置。 1.pom.xml中引入: <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId>
全栈程序员站长
2022/09/15
3.4K0
Druid 异常分析 java.sql.SQLException: interrupt Druid
今天看线上一直报 java.sql.SQLException: interrupt 因为第一次遇到也在网上找了一些资料,其中网上的大部分内容如下:
双鬼带单
2021/05/13
9.5K1
相关推荐
聊聊druid的borrow行为
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验