连接池 Druid (补充) - removeAbandoned

很久之前写的文章,格式惨不忍睹,浏览了下还是有人看的,但是好像不支持在原文上直接修改格式,所以重新调整一下吧。

removeAbandoned参数

removeAbandoned参数指定连接池是否移除被遗弃的连接。

具体的逻辑分两部分:一部分是设置活动连接、准备将来判断是否应该被遗弃,这个动作是在getConnection获取连接后执行的;另外一部分是在连接回收任务DestroyTask中,我们在分析连接回收的文章中忽略了这部分内容,今天补充一下。

getConnection方法

getConnection方法获取连接之后判断removeAbandoned参数打开的话,就设置当前连接的connectedTimeNano为系统时间,然后将当前连接放入activeConnections中,准备被回收线程检查、移除。

代码在getConnectionDirect中:

           if (removeAbandoned) {StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();poolableConnection.connectStackTrace = stackTrace;poolableConnection.setConnectedTimeNano();poolableConnection.traceEnable = true;activeConnectionLock.lock();try {activeConnections.put(poolableConnection, PRESENT);} finally {activeConnectionLock.unlock();}}

removeAbandoned方法

第二部分需要回忆一下上一篇文章中的DestroyTask的run方法,在调用shrink之后判断RemoveAbandoned则调用removeAbandoned()方法:

@Overridepublic void run() {shrink(true, keepAlive);if (isRemoveAbandoned()) {removeAbandoned();}}

removeAbandoned方法源码,分段贴出:

   public int removeAbandoned() {int removeCount = 0;long currrentNanos = System.nanoTime();List<DruidPooledConnection> abandonedList = new ArrayList<DruidPooledConnection>();activeConnectionLock.lock();try {Iterator<DruidPooledConnection> iter = activeConnections.keySet().iterator();for (; iter.hasNext();) {DruidPooledConnection pooledConnection = iter.next();if (pooledConnection.isRunning()) {continue;}long timeMillis = (currrentNanos - pooledConnection.getConnectedTimeNano()) / (1000 * 1000);if (timeMillis >= removeAbandonedTimeoutMillis) {iter.remove();pooledConnection.setTraceEnable(false);abandonedList.add(pooledConnection);}}} finally {activeConnectionLock.unlock();}

首先activeConnectionLock加锁。

循环检查activeConnections中的每一个连接。

如果连接isRunning()的话,则不处理当前连接。连接的running状态是在连接执行sql语句前调用beforeExecute方法设置为true、执行完成后调用afterExecute方法设置为false的。也就是说running状态其实就是字面意思,如果一个连接正在执行sql语句,running为true,执行完成后,running为false。

计算timeMillis为连接获取之后到现在的时长,注意connectedTimeNano是在我们上面所说的第一步:连接获取之后设置的。

如果timeMillis大于参数设定的移除时长removeAbandonedTimeoutMillis的话,则连接放入abandonedList中准备移除。

之后,释放activeConnectionLock锁。

后面的代码就不贴出了,很简单,就是从abandonedList列表中逐个取出连接,关闭连接,标记当前连接的abandoned=true。

总结

结合Druid连接池的连接归还过程,总结一下removeAbandoned参数的总体使用逻辑:

  1. removeAbandoned参数设置为true的话,需要配合设置一个removeAbandonedTimeoutMillis,认定连接被遗弃的时长
  2. 从连接给获取到开始计时,并将连接放入到活动连接activeConnections中
  3. 连接在执行sql语句过程中(running状态)不会被认定为遗弃而回收
  4. 连接执行完成、归还到连接池的时候,如果还没有被认定为遗弃,则从activeConnections中移除(安全了…)
  5. 连接尚未归还给连接池、也不在running状态的情况下(比如应用在执行完sql语句之后不close连接的情况下),连接回收线程检查该连接自从被getConnection获取之后到现在的时长如果大于removeAbandonedTimeoutMillis的话,就会给该连接打标记:需要被遗弃。并关闭该连接,不再允许其归还到连接池

有关removeAbandoned参数,在初始化过程中的initCheck()方法中有一段代码:

         if (removeAbandoned) {LOG.warn("removeAbandoned is true, not use in production.");}

意思很明确,removeAbandoned参数并不是用在生产环境中的,是专为测试环境准备的参数。因此,建议大家开发过程中干脆忘记这个参数,不要设置为打开。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/188410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应用于智慧社区的AI边缘计算盒子+AI算法软硬一体化方案

据统计&#xff0c;全国大约有45W个小区&#xff0c;监控高空抛物、治理乱扔垃圾、人员管理、烟火检测、占道、人流量检测、车型检测等&#xff1b;营造社区安全等需求跟每一个参与者息息相关&#xff0c;据法院公开资料显示&#xff0c;每年有1000宗以上跟高空抛物有关的各类案…

js一行压缩库

js一行压缩库 压缩 JavaScript 代码通常是为了减小文件大小&#xff0c;提高加载速度。有一些常见的工具和软件可用于这个目的。以下是其中一些&#xff1a; UglifyJS&#xff1a; UglifyJS 是一个流行的 JavaScript 压缩工具&#xff0c;可以通过命令行或作为一个 npm 包来使…

进程与线程的区别

作者简介&#xff1a; zoro-1&#xff0c;目前大二&#xff0c;正在学习Java&#xff0c;数据结构,mysql,javaee等 作者主页&#xff1a; zoro-1的主页 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f496; 进程与线程的区别 进程线程进程与线…

Linux网络编程中的反应堆模型详解

文章目录 概述介绍原理4. 使用场景总结&#xff1a; 概述 摘要&#xff1a;反应堆模型&#xff08;Reactor Pattern&#xff09;是一种常用于Linux网络编程的设计模式&#xff0c;用于处理多个并发连接。本文将详细介绍反应堆模型的原理&#xff0c;使用场景以及如何在C语言中…

HyperBDR云容灾v4.10.1发布,划重点:支持UCloud云平台自动化容灾+新增可灵活定义的备份策略

版本更新 HyperBDR云容灾v4.10.1版本来啦&#xff01; 此次更新为大家带来了多个新功能&#xff0c;下面让我们来看看具体是哪些吧~ 01 策略管理新功能&#xff1a; 多时间段限速功能&#xff1a; 更加灵活的多个时间段限速选择&#xff0c;可以在创建策略时为不同的时间段设…

数字人可以为文化传播带来什么?

近日&#xff0c;由哈萨克斯坦驻华大使馆、中国外文局文化传播中心、中关村科幻产业创新中心联合发起的中哈青年友谊数字人怡漾和苏路&#xff08;Сұлу&#xff09;正式发布。其中&#xff0c;代表中方形象的数字人怡漾&#xff0c;不仅将成为中哈青年文化交流的标志与代言…

JavaScript WebAPI(三)(详解)

这次介绍一下webAPI中的一些知识&#xff1a; 回调函数 回调函数是指 如果将函数A做为参数传递给函数B时&#xff0c;我们称函数A为回调函数 例如&#xff1a; // 立即执行函数中传递的函数是一个回调函数 (function(){ console.log("我是回调函数") })(); // …

无分模块下Mybatis官方生成器

有无分模块其实对生成器生成代码没有影响&#xff0c;只是无分模块更加好理解&#xff0c;也就是添加插件和依赖&#xff0c;指定配置文件&#xff0c;运行插件即可。 添加依赖和插件 在插件处指定配置文件位置 <dependencies><!-- MyBatis核心依赖包 --><de…

汽车行驶不同工况数据

1、内容简介 略 28-可以交流、咨询、答疑 2、内容说明 汽车行驶不同工况数据 汽车行驶不同工况数据 ECE、EUDC、FTP75、NEDC、自定义 3、仿真分析 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1AAJ_SlHseYpa5HAwMJlk1w 提取码&#xff1a;rvol

Visual Studio2022创建Windows服务程序

文章目录 Visual Studio2022创建Windows服务程序打开工具创建新项目创建成功重命名服务添加安装程序编写逻辑生成程序安装服务打开服务启动服务停止服务卸载服务修改项目配置重新生成安装服务启动服务 Visual Studio2022创建Windows服务程序 打开工具 创建新项目 创建成功 重命…

文件重命名不再困难:文件智能化重命名技巧,告别手动提升效率

在日常工作中&#xff0c;经常会遇到要修改文件名的场景。传统的文件重命名方法往往要手动输入新的文件名&#xff0c;不仅耗时而且容易出错。为了提高效率&#xff0c;可以采用一些智能化重命名的技巧&#xff0c;告别手动修改文件名的繁琐过程&#xff0c;让文件重命名变得更…

华为鸿蒙工程师成“热门”!最高年薪160万,只看技术不看年龄

引言&#xff1a; 今天&#xff0c;在互联网行业&#xff0c;超过30岁的工程师往往被认为是“码农”的生命周期终点。然而&#xff0c;华为鸿蒙系统的崛起&#xff0c;却再次给予了这些35岁以上的工程师们第二春的机会。国内一线互联网公司纷纷向鸿蒙系统靠拢&#xff0c;导致…

Java中集合和数组的区别以及转换方式

一.数组 在Java中&#xff0c;数组是一种用于存储固定大小的相同类型元素的数据结构。数组可以存储基本数据类型&#xff08;如int、double、char等&#xff09;或对象类型。 以下是一个声明和初始化Java数组的例子&#xff1a; int[] intArray new int[5]; // 声明一个in…

树莓派用CSI摄像头,ROS调用时报错Could not find vchostif library

使用树莓派4B&#xff0c;ubuntu20.04下&#xff0c;使用CSI摄像头参考&#xff1a; https://blog.csdn.net/qq_52785580/article/details/122648288 在编译库时&#xff0c;要是碰到错误 Could not find vchostif library 说明没有安装相关库&#xff0c; 执行&#xff1a;…

代码随想录算法训练营第五十二天【动态规划part13】 | 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

300.最长递增子序列 题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 求解思路 动规五部曲 1.dp数组及其下标定义&#xff1a; dp[i]表示包括i以前的以nums[i]结尾的最长递增子序列的长度 2.状态转移方程&#xff1a; 位置i的最长升序…

RedisTemplate序列化的问题

1. 问题 在使用RedisTemplate 保存Set类型的数据时候出现保存的key和value被序列化了&#xff0c; public long sSet(String key, String... values) {try {return redisTemplate.opsForSet().add(key, values);} catch (Exception e) {LOGGER.error("异常{}", e);…

一文带你了解网络安全简史

网络安全简史 1. 上古时代1.1 计算机病毒的理论原型1.2 早期计算机病毒1.3 主要特点 2. 黑客时代2.1 计算机病毒的大流行2.2 知名计算机病毒2.3 主要特点 3. 黑产时代3.1 网络威胁持续升级3.2 代表性事件3.3 主要特点 4 高级威胁时代4.1 高级威胁时代到来4.2 著名的APT组织4.3 …

极客时间 - 如何成为学习高手【文章笔记 + 思考总结】

如何成为学习高手【文章笔记 思考总结】 高度自律 高度自律 5分钟起步法。 稍微走在计划前面。 替代拖延法。 自律&#xff1a;从不自律的念头中&#xff0c;约束自己。有变弱倾向时进行对抗。 在一种痛苦和另一种痛苦之间做选择&#xff0c;选择那个有意义的痛苦。 在某些固…

rkmedia_vi_get_frame_test.c 代码解析

使用示例&#xff1a; 录像&#xff1a; rkmedia_vi_get_frame_test -a /etc/iqfiles/ -I 1 -o 1080.nv12 然后用yuvplayer.exe可以播放。 录像10帧&#xff1a; rkmedia_vi_get_frame_test -a /etc/iqfiles/ -I 1 -o 1080.nv12 -c 10 解析代码&#xff1a; #include <as…

【note: This is an issue with the package mentioned above, not pip.】

安装gym时出现问题&#xff0c;note: This is an issue with the package mentioned above, not pip. 报错原因&#xff1a; 缺失了某些依赖模块&#xff0c;所以安装报错。 Collecting package metadata (current_repodata.json): done Solving environment: failed with in…