【Druid源码阅读】8. 对于连接的管理

三维旋转详细解读(Rodrigues‘ Roatation Formula 罗德里格旋转公式) 三维旋转引言三维旋转1)欧拉角2)轴角式旋转分解1)V||的旋转2)V⊥的旋转3)V的整体旋转 引言 前面我们了解了 复数在二维旋转中的作用与联系 而四元数与三维旋转之间的关系与复数对二维旋转有很多类似的地方,下面我们就先来详细了解一下三维旋转的过程。 三维旋转 首先讨论一下三维旋转,我们了解到常用的三维旋转有两种方式: 1)欧拉角 即按照一定的顺序,分别对X, Y, Z三个轴进行旋转 θ 角。绕各旋转轴的旋转矩阵为: 然后任意的三维旋转可以分解成上述三种旋转方式的组合。(注意:三个旋转的顺序是非常重要的 阅读详情

目录

testOnBorrow

testWhileIdle

testOnReturn

结论


第6篇中,分析了如何获取连接,那获取连接后,Druid 是如何管理这些连接的呢?

可以先给结论,是通过几个关键参数来控制的

testOnBorrow
testOnReturn
testWhileIdle

testOnBorrow

首先看 testOnBorrow,从字面理解,是从连接池中获取连接时,要测试连接是否可用。下面是代码中使用这个属性的几处地方:

1179 和 1193 行,是在 validationQueryCheck() 方法中使用的,这个方法是判断是否正确设置了验证连接可用性相关的参数,即如下参数:

testOnBorrow
testOnReturn
testWhileIdle
validConnectionChecker
validationQuery

高亮的 1452 行是个关键,在 DruidDataSource#getConnectionDirect(long maxWaitMillis) 方法中:

if (testOnBorrow) {
    boolean validate = testConnectionInternal(poolableConnection.holder, poolableConnection.conn);
    if (!validate) {
        if (LOG.isDebugEnabled()) {
            LOG.debug("skip not validate connection.");
        }

        discardConnection(poolableConnection.holder);
        continue;
    }
}

可以看到,如果设置了这个参数为 true,就通过 testConnectionInternal 这个方法验证连接是否有效,如果连接无效,通过 discardConnection 方法抛弃连接。

testWhileIdle

下面在看下如果设置为 false 的逻辑,同时里面引出了 testWhileIdle 这个属性(使用空闲时间验证连接可用性)。

} else {
    if (poolableConnection.conn.isClosed()) {
        discardConnection(poolableConnection.holder); // 传入null,避免重复关闭
        continue;
    }

    // 使用空闲时间验证连接可用性
    if (testWhileIdle) {
        final DruidConnectionHolder holder = poolableConnection.holder;
        // 当前时间戳
        long currentTimeMillis             = System.currentTimeMillis();
        // 最近一次使用这个连接的时间戳
        long lastActiveTimeMillis          = holder.lastActiveTimeMillis;
        // 最近一次执行SQL的时间戳
        long lastExecTimeMillis            = holder.lastExecTimeMillis;
        // 最近一次保活时间戳
        long lastKeepTimeMillis            = holder.lastKeepTimeMillis;

        // 如果要检查执行SQL时间,并且执行SQL和使用连接的时间戳不相等时
        if (checkExecuteTime
                && lastExecTimeMillis != lastActiveTimeMillis) {
            // 把最近一次执行SQL时间戳赋值给最近一次使用连接的时间戳
            lastActiveTimeMillis = lastExecTimeMillis;
        }

        // 如果最近一次保活时间戳比最近一次使用连接时间戳更新,赋值
        if (lastKeepTimeMillis > lastActiveTimeMillis) {
            lastActiveTimeMillis = lastKeepTimeMillis;
        }

        // 连接空闲时间
        long idleMillis                    = currentTimeMillis - lastActiveTimeMillis;

        // 剔除连接最小间隔时间
        long timeBetweenEvictionRunsMillis = this.timeBetweenEvictionRunsMillis;

        if (timeBetweenEvictionRunsMillis <= 0) {
            // 默认 60s
            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;
            }
        }
    }
}

通过分析可知,只有这个连接的空闲时间超过了剔除最小时间时,才会对连接进行检测,所以不会像获取或归还连接时就进行测试有性能影响,所以是推荐打开的属性。

testOnReturn

这个属性就是控制在归还连接给连接池时,是否做连接可用测试。

可以看到,在 DruidDataSource 的 1955 行使用了这个属性,为 true 时,对连接进行可用测试,如果已经断开连接了,就关闭连接。

final boolean testOnReturn = this.testOnReturn;

...

if (testOnReturn) {
    boolean validate = testConnectionInternal(holder, physicalConnection);
    if (!validate) {
        JdbcUtils.close(physicalConnection);

        destroyCountUpdater.incrementAndGet(this);

        lock.lock();
        try {
            if (holder.active) {
                activeCount--;
                holder.active = false;
            }
            closeCount++;
        } finally {
            lock.unlock();
        }
        return;
    }
}

以上代码是在如下方法中的:

protected void recycle(DruidPooledConnection pooledConnection) throws SQLException

recycle(DruidPooledConnection) 被调用的地方只有如下方法:

public void recycle() throws SQLException 

 被3个地方调用,可以知道都是在关闭连接时进行的调用。

结论

建议关闭 testOnBorrow 和 testOnReturn,打开 testWhileIdle。

基于 Qt C++ 的 2D 动画制作工具 你可以修改它的中心坐标 (X, Y)、宽度 (W)、高度 (H),或点击 "选择颜色" 按钮改变其填充色。* **图形视图 (`QGraphicsView` 和 `QGraphicsScene`)**: 用于显示和编辑当前帧的内容。 阅读详情

相关推荐

[OrCad电路板设计系统].Orcad.Pspice.9.2下载安装

Orcad.Pspice.9.2详细下载安装图文步骤1 安装前准备工作1.1 下载安装包1.2 解压2 安装时步骤2.1 安装文件2.2 破解文件3 安装完成 1 安装前准备工作 1.1 下载安装包 打开百度网盘APP 链接:https://pan.baidu.com/s/1cMFxHUvuh5iEhFVT-lvciQ 提取码:7m65 1.2 解压 解压下载好的安装包 2 安装时步骤 2.1 安装文件 1.点击Setup安装文件,出现警告对话框,告诉你应该关闭所有病毒防火墙,点击确定 2.进入安装界面,

weixin_48924581的博客 1万+

2022-05-14 Druid源码阅读——Druid连接检查机制

1.Druid提供的校验参数 Druid对于连接校验提供了六个参数,其中testOnBorrow、testOnReturn、testWhileIdle是Druid所提供的连接校验时点,其余三个参数为校验的相关配置。 配置 缺省值 说明 validationQuery 用来检测连接是否有效的sql,要求是一个查询语句,常用select ‘x’。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 val

风灵玄的博客 3415

油气井管柱力学发展

油气井管柱力学发展 1 石油管柱力学问题的发复杂性 1)油气管柱动力学的非线性 钻井中钻柱在重力、钻压、扭矩、钻井液浮力和井壁约束等作用下,产生三维变形。一方面随井眼轴线的弯曲而弯曲,这一变形被称为管柱的初位移;另一方面,管柱在运动过程中相对井眼轴线也有变形,这种变形被称为计算位移。管柱大变形主要表现在初位移部分,计算位移相对很小。大曲率井眼中管柱产生大挠度,但管柱很长且柔软性较好,变形一般仍保持...

weixin_43831995的博客 949

method:com.alibaba.druid.pool.DruidAbstractDataSource.testConnectionInternal问题解决

你可以创建一个后台线程,定期检测连接的有效性,并在连接无效时将其废弃。不管你选择哪种方法,都需要确保在应用程序中实现合适的连接有效性检测,以确保连接池中的连接始终保持可靠和有效。,建议实施其他有效的连接有效性检测方法,例如设置合适的连接超时时间或使用合理的数据库查询来确认连接是否有效。这意味着即使数据库连接已经失效,连接池也不会立即知道,而继续使用失效的连接可能会导致异常或错误的数据库操作。:由于连接池不会自动检测连接的有效性,应用程序可能会在使用已失效连接时遇到数据库异常,例如连接超时或无效查询。

ggjklncffd的博客 1672

基于Python实现基于遥感指数的水体提取

基于Python实现基于遥感指数的水体提取

gis收藏家的博客 6145

HighScore3.0实战指南:XRD物相分析从入门到精通(持续更新版)

本文提供HighScore3.0软件进行XRD物相分析的完整实战指南。从软件设置、数据导入、背景扣除、寻峰等预处理步骤,到核心的Search & Match物相搜索匹配、Rietveld精修定量,以及结果输出与常见问题排查,系统讲解了从入门到精通的全流程操作与核心技巧,帮助用户高效完成材料物相鉴定与分析工作。

weixin_29310605的博客 1042

池化技术(一)Druid是如何管理数据库连接的?

Druid是如何管理数据库连接的 前置: 基于依赖程序的版本信息:druid:1.1.16 驱动程序mysql-connector-java:8.0.17 下方流程中涉及到的类、属性、方法名均列在这里:Druid-类图-属性表 ←该表格用来辅助理解下面的流程图和代码,不用细看,混乱时可用来理清关系。 本文会通过getConnection作为入口,...

weixin_30608131的博客 701

计算机视觉教程2-3:图解双线性插值算法&最近邻插值算法

提出此算法的背景是基于图片的缩放,在图片缩放的过程中,实质上就是将原图像像素矩阵像素值,填到目标图像像素矩阵中,目标图像像素矩阵可能比原图像像素矩阵大(图片放大),也可能小(图片缩小)。我们假设图片的宽(WidthWidthWidth)和高(HeightHeightHeight)是按同比例缩放的,那么 srcXsrcWidth=dstXdstWidth\frac{srcX}{srcWidth}= \frac{dstX}{dstWidth}srcWidthsrcX​=dstWidthdstX​ ...

FRIGIDWINTER的博客 7280

Druid连接池超时连接清理配置排坑

案发现场 在给某个陈旧项目的连接池组件替换成Druid,开开心心地用上了网上淘来的一份推荐配置,在本地运行了下没有问题便发布到环境上去试跑看下,随后大概是过了一杯咖啡的时间,环境上就出现了如下报错信息, [DEBUG][com.alibaba.druid.pool.DruidDataSource:1319][-][-] skip not validate connection. [DEBUG][com.alibaba.druid.util.JdbcUtils:75][-][-] close connecti

xingor的博客 2万+

ADT MCP Server 把 ABAP 开发带进 Agent 模式

今天讨论 ADT MCP Server,不能只把它看成 Visual Studio Code 里多出来的一个开关。它真正有意思的地方,在于它把 ABAP 后端开发里那些原本需要手工点击、手工创建、手工激活、手工查服务元数据的动作,包装成一组可以被 GitHub Copilot 这类 coding agent 调用的工具。SAP 在 RAP130 练习里把它描述为运行在 ADT for Visual Studio Code 扩展内部的本地 HTTP Server,它实现的是 Model Context Pro

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 181

飞腾UEFI配置GPIO—飞腾FT2000/4 (D2000/8) GPIO引脚配置及使用

讲解了在飞腾UEFI代码中如何添加GPIO配置相关代码,并以GPIO1_B0—B7为例,将这8个引脚配置为GPIO工作模式并默认输出低电平

qq_30135687的博客 5343

springboot 搭配的 的 druid最新版本 警告 discard long time none received connection. 问题

在使用了新版的 druid-1.2.5 以后,日志中一直在报 Error,内容是 discard long time none received connection. , jdbcUrl : 巴拉巴拉,但程序运行并没有受到影响,但看着一大片错误就浑身难受,我决定去他们的源码里看看到底是怎么回事。网上搜索到的解决方案是回退到1.1.22可解决,但我觉得这样的解决方案有点傻X,不去想解决问题,而是倒车躲避。 看看源码是谁在报错 进到源码搜索这句「discard long time ...

飞翔小猪的博客 4万+

RT-DETR改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣本专栏已更新260多种不同的改进方法,所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行。2️⃣所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,紧跟学术热点,适应不同的任务场景。3️⃣团队内发表数篇SCI论文,熟悉完整的发表流程,订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容。4️⃣专栏内容会持续更新,最近更新时间:2024-12-4。项目介绍在大家购买专栏后,加入学习

Limiiiing的博客 2万+

【Druid源码阅读】1. 初识Druid

Druid源码阅读

hellboy0621的博客 1541

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Druid源码阅读9-什么时候会创建新连接?

Druid连接的创建时点 1. initialSize>0时,将在init()时进行创建,此时创建连接由是否指定asyncInit参数来判断,需要注意的是,此时如果采用异步创建需要设置线程池,否则即使开启asyncInit也依旧会采用同步创建。 2. 开启keepAlive并且initialSize<minIdle,将在init()时进行创建,此时将采用异步方式创建连接 3. 抛弃连接(discardConnection)且连接池中活跃连接总数<最小数量,此时采用异步方式创建连接 4

suxiao_21的博客 1184

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

ruoyi框架源码阅读之--Druid连接池

没啥可讲的,其实就是配置一下数据源,配置一下连接池各种属性,然后写个配置类把连接池甩进IOC中。不过这些配置可以拿来就用,这里记录一下。

攻城狮的博客 1315

Druid源码阅读系列(十一)

以下内容是对这两周源码查看的一个梳理,以前没有看过Druid的源码,算是从零开始,研究的不那么深入。希望我的整个研究思路能对你有所帮助。 DruidDataSource Druid的数据源封装类,通过设置需要的参数之后实例化然后就可以愉快的使用Druid了。 DruidDataSource里最核心的方法是init(),这个方法里面有很多校验和一些设置参数的初始化,驱动加载,filter的加载等。然后init()这个方法调用不是必须的,因为在调用getConnect()时会自动调用init(). 我认为里面比

潇一居 441

记录一次springboot druid连接池配置信息错误,一直重试连接的问题

------------恢复内容开始------------ 转载地址:https://blog.csdn.net/sadness_lxy/article/details/89136418 在昨天项目开发中,使用了Druid作为数据库连接池,当数据源密码错误时,报出了以下错误: 2019-04-09 10:09:36 [Druid-ConnectionPool-Create-205359...

Mrerlou的博客 2441

Druid源码阅读8-连接泄露检测

removeAbandoned()方法属于DruidDataSource类。 这个方法用于连接泄露检测,通过removeAbandoned属性配置是否打开连接泄露检测。 源码思路如下: 1.获取activeConnectionLock activeConnectionLock.lock(); 2.判断连接是否在使用中。 pooledConnection.isRunning() 3.判断连接创建时间如果大于removeAbandonedTimeoutMillis, 设置traceEnable为fals

suxiao_21的博客 564

Druid 数据库连接池介绍及配置

1. Druid是什么? Druid是Java语言中最好的数据库连接池。Druid能够提供强大的监控和扩展功能。 2. 在哪里下载druid 正式版本下载: maven中央仓库:http://central.maven.org/maven2/com/alibaba/druid/ 3. 怎么获取Druid的源码 Druid是一个开源项目,源码托管在github上,源代码仓库地址...

jakeswang的博客 2012

druid1.2.8源码阅读:第十天

druid1.2.8源码阅读:第十天 文章目录druid1.2.8源码阅读:第十天一、keepAlive 实现方式 一、keepAlive 实现方式 与keepAlive相关的参数有两个: dataSource.setKeepAlive(true); dataSource.setKeepAliveBetweenTimeMillis(100000); 用到keepAlive的地方: 第一个地方:如果 idle 时间大于探活时间 if (keepAlive && idleMillis >

hefrankeleyn的博客 550

druid1.2.8源码阅读:第八天

druid1.2.8源码阅读:第八天 文章目录druid1.2.8源码阅读:第八天一、recycle()函数 一、recycle()函数 /** * 回收连接 */ protected void recycle(DruidPooledConnection pooledConnection) throws SQLException { final DruidConnectionHolder holder = pooledConnection.holder;

hefrankeleyn的博客 242

druid产生大量mysql的sleep连接

在使用druid连接池后,show full processlist 后发现有大量sleep状态的链接,高峰期时达到1000多个,项目框架用的springmvc+mybatis,由spring管理的链接在每次数据库操作后应该是释放连接的,排除是代码泄露连接的可能性。有的话就会关闭该连接。如果某个高峰时间段,每台连接数都跑满,则数据库中每个连接sleep的时间是(300+120)秒的时间,如果在这300到420秒的时间段内,请求很频繁的话,数据库中的连接数短期内是不会降下来的。

java1527的博客 2275

数据库连接池原理与实战 HikariCP与Druid深度对比

本文深入探讨数据库连接池的核心原理与实践优化,重点对比HikariCP和Druid两大主流连接池。通过真实案例展示连接池配置不当导致的系统问题,详细分析HikariCP的无锁设计和Druid的监控机制。文章提供性能测试数据、生产环境配置模板及故障排查指南,涵盖连接泄露检测、性能下降分析等典型场景。针对不同业务需求,给出选型建议:追求极致性能选HikariCP,需要全面监控选Druid。最后强调连接池调优是持续过程,需结合业务特点配置并建立监控机制。

七夜zippoe的博客 1563

【Druid】Druid连接池泄露问题排查: wait millis 60000, active 50, maxActive 50

要排查Druid连接池泄漏问题,可以按照以下步骤进行:检查代码中的连接释放:确保在使用完连接后,及时调用或相应的释放连接的方法。确保没有遗漏或误释放连接的情况。检查连接池配置:确认连接池的参数设置是否正确。包括最大连接数、最小空闲连接数、连接超时时间等。确保连接池的配置与实际需求一致,并没有设置过小或过大。监控连接池状态:通过连接池的监控工具,如Druid提供的数据源监控页面,查看连接池的状态信息。检查活跃连接数、空闲连接数、等待获取连接的线程数等指标,以了解连接池的使用情况。

后端研发工程师Marion的博客 4063

druid1.2.8源码悦读:第五天

druid1.2.8源码悦读_05 文章目录druid1.2.8源码悦读_05一、回顾二、`dataSource.getConnectionDirect(maxWaitMillis)`2.1 进入一个无限循环:`for(;;)`2.2 调用`getConnectionInternal(maxWaitMillis)`(1)根据maxWaitMillis创建`nanos`(2)`connectCount++;`(3)`takeLast();`2.3 `takeLast();`(1)`emptySignal();

hefrankeleyn的博客 354

源码详解系列(六) ------ 全面讲解druid的使用和源码 已停更

本文将包含以下内容(因为篇幅较长,可根据需要选择阅读): 1. `druid`的使用方法(入门案例、`JDNI`使用、监控统计、防御SQL注入) 2. `druid`的配置参数详解 3. `druid`主要源码分析

子月生的博客 1162
上一篇: 【Druid源码阅读】9. 过滤器
下一篇: 【Druid源码阅读】10. 过滤器工作原理
hellboy0621
博客等级 码龄9年 61粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值