apache-common-pool2(配置参数详解,以及资源回收,从池中获取资源,将资源返还给池 逻辑解析)

OAuth2.0集成SpringSecurity加JWT实现单点登录 单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统。也就是说只要登录一次单体系统就可以 阅读详情

本人基于 commons-pool2-2.3.jar 进行分析的,查看了jar的源码,分析源码的工作原理,总结出来的。

maxTotal 允许创建资源的最大数量,默认值 8,-1 代表无数量限制(int类型)

blockWhenExhausted 默认值 true ,当资源耗尽时,是否阻塞等待获取资源

maxWaitMillis 获取资源时的等待时间,单位毫秒。当 blockWhenExhausted 配置为 true 时,此值有效。 -1 代表无时间限制,一直阻塞直到有可用的资源。(long类型)

testOnBorrow 默认值 false ,当设置为true时,每次从池中获取资源时都会调用 factory.validateObject() 方法
testOnCreate 默认值 false,当设置为true时,只有当创建资源时才会调用 factory.validateObject() 方法

lifo 资源的存取数据结构,默认值 true,true 资源按照栈结构存取,false 资源按照队列结构存取

fairness 当从池中获取资源或者将资源还回池中时 是否使用 java.util.concurrent.locks.ReentrantLock.ReentrantLock 的公平锁机制。 默认值 false, true 使用公平锁,false 不使用公平锁,

timeBetweenEvictionRunsMillis 回收资源线程的执行周期,单位毫秒。默认值 -1 ,-1 表示不启用线程回收资源。(long类型)

evictionPolicyClassName 资源回收策略, 默认值 org.apache.commons.pool2.impl.DefaultEvictionPolicy(String类型)

minEvictableIdleTimeMillis 资源最小空闲时间, 默认值 1800000,单位 毫秒,(long类型 )
softMinEvictableIdleTimeMillis 软资源最小空闲时间, 默认值 1800000,单位 毫秒,(long类型 )
(备注,这个两个参数,在资源回收策略中,会使用到)

maxIdle 最大空闲资源数,默认值 8 (int类型)

minIdle 最小空闲资源数,默认值 0 (int类型 ,当使用pool2编写自己的资源池时,结合spring的IOC,当项目启动时,会自动创建minIdle个资源。如何使用pool2,见我的另一篇文章 http://blog.youkuaiyun.com/liang_love_java/article/details/50511012)

testWhileIdle 默认值 false; 设置为 true 时,当回收策略返回false时,则 调用 factory.activateObject()和factory.validateObject()

testOnReturn 默认值 false; 设置为 true 时,当将资源返还个资源池时候,验证资源的有效性,调用 factory.validateObject()方法,如果无效,则调用 factory.destroyObject()方法

numTestsPerEvictionRun 资源回收线程执行一次回收操作,回收资源的数量。默认值 3, (int类型)。
备注:
当 设置为0时,不回收资源。
设置为 小于0时,回收资源的个数为 (int)Math.ceil( 池中空闲资源个数 / Math.abs(numTestsPerEvictionRun) );
设置为 大于0时,回收资源的个数为 Math.min( numTestsPerEvictionRun,池中空闲的资源个数 );

从池中获取资源的逻辑
1:
如果 blockWhenExhausted 配置的 为 false,从资源池中获取资源,如果获取不到,则判断当前池中的对象数量是否超过了 maxTotal 设置的数量,如果没有超过,
则通过调用factory.makeObject() 创建对象,并将对象放入池中,执行第2步 。如果超过了,则返回 null,逻辑到此结束。
如果 blockWhenExhausted 配置的 为 true ,从资源池中获取资源,如果获取不到,则判断当前池中的对象数量是否超过了 maxTotal 设置的数量,如果没有超过,
则通过调用factory.makeObject() 创建对象,并将对象放入池中,执行第2步 。如果超过了,则阻塞等待,如果 MaxWaitMillis 配置的为 -1 则 阻塞等待,直到有可用的资源为止。
如果 maxWaitMillis 配置为 1000 则 阻塞等待 1000毫秒,如果有可用资源,执行第2步,如果没有则返回 null,逻辑到此结束。
2:将资源的状态 修改为 已分配,执行 第 3 步
3:调用 factory.activateObject() 方法,执行 第 4步
4:如果 testOnBorrow 或者 testOnCreate 中有一个 配置 为 true 时,则调用 factory.validateObject() 方法
5:以上步骤都完成了,返回 资源对象

将资源返还给池的逻辑
1:检查配置参数 testOnReturn,如果 为 true,调用 factory.validateObject()方法,验证资源对象的有效性,验证结果为 false,则调用 factory.destroyObject()方法,逻辑到此结束。
验证结果为 true,则执行第 2 步。
2:调用 factory.passivateObject()方法,然后执行 第 3 步
3:将资源的状态 修改为 未分配,执行第 4 步
4:进行判断 ( 资源池是否关闭 || (maxIdle > -1 ) && ( maxIdle <= 资源池空闲资源个数) )
如果 判断为 true,则调用 factory.destroyObject()方法,逻辑到此结束。
如果 判断为 false,则 将资源返还给资源池,逻辑到此结束。

Apache_common_pool 启动一个线程执行释放资源的工作(使用 java.util.Timer 实现)从池中回收资源逻辑(回收资源的意思是,将资源从池中删除掉,例如,如果是TCP链接,则需要将链接断开,并从池中删除掉。)
1:根据 evictionPolicyClassName 配置的参数创建回收策略,
默认回收策略源码

import org.apache.commons.pool2.PooledObject;
public class DefaultEvictionPolicy
implements EvictionPolicy
{
public boolean evict(EvictionConfig config, PooledObject underTest, int idleCount)
{
if (((config.getIdleSoftEvictTime() < underTest.getIdleTimeMillis()) && (config.getMinIdle() < idleCount)) || (config.getIdleEvictTime() < underTest.getIdleTimeMillis()))
{
return true;
}
return false;
}
}
if条件判断与
(softMinEvictableIdleTimeMillis < 资源的空闲时间 && Math.min(maxIdle,minIdle) < 目前池中空闲的资源数) ||
minEvictableIdleTimeMillis < 资源的空闲时间
等价
2:根据配置的参数 numTestsPerEvictionRun 计算,要回收的资源数量(具体的计算规则,请参照源码)
3:根据回收策略判断,资源是否需要回收。如果 是 则将资源从池中删除,并调用factory.destroyObject()方法。
如果 否 则根据配置的 testWhileIdle 参数,判断 是否执行 factory.activateObject()和factory.validateObject() ,factory.passivateObject() 方法。如果 testWhileIdle 配置为 true,则以次执行 factory.activateObject(),factory.validateObject(),factory.passivateObject()

关闭搜狗输入法右下角广告的解决方案 本文主要介绍了关闭搜狗输入法右下角广告的解决方案,希望能对使用搜狗输入法的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 阅读详情

相关推荐

win x64下安装oracle 12c出现[INS-30131]报错的解决方案

问题:  win x64下安装oracle 12c出现[INS-30131]报错的解决方案 安装oracle11g碰到“无法访问临时位置”的问题,详细信息如下: INS-30131] 执行安装程序验证所需的初始设置失败。 原因 - 无法访问临时位置。   操作 - 请确保当前用户具有访问临时位置所需的权限。   附加信息:  - 所有节点上的框架设置检查都失败  

一条道走到黑的GISer 1348

common-pool2之socket连接池

common-pool2实现socket连接池 maven依赖: <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> 参数配置: lifo: 对象池存储空闲对象是使用的LinkedBlockingDeque,建议使用默认值true fairness:

garbagetoshabi的博客 2776

用R语言实现“中断时间序列分析” --- R code for ITS

ITS方法可用于评估一项干预措施的效果,从水平改变和斜率改变两个角度来描述干预引起的变化。

franksui的博客 4030

apache common pool2 对象池使用和原理

}} }System . out . println("激活对象,借用时调用");System . out . println("销毁对象");System . out . println("创建对象");System . out . println("钝化对象,归还时调用");System . out . println("判断对象是否可用");} }

weixin_36001569的博客 1695

AIDD-人工智能药物设计-构建基于机器学习方法的在线预测平台高准确预测药物诱导骨毒性

在此基础上,提取多种药物分子特征,包括分子指纹(如MACCS、Morgan、RDKit、TopologicalTorsion、AtomPairs与Descriptors)及分子图谱,通过Transformer编码器与神经网络进行机器学习模型训练。最后,将训练好的模型部署为在线Web服务器(BoneToxPD),供用户快速预测药物的骨毒性。本研究不仅在骨毒性预测的准确性方面取得了突破,还在模型解释性方面提供了新的视角,通过注意力机制精准识别出影响骨毒性的关键化学基团,推动药物研发领域更安全、更高效的发展。

itwangyang520的博客 1082

jedis高版本的JedisPoolConfig没有maxActive和maxWait

原文:http://www.zyiqibook.com/article225.html 通过maven pom下载新版jedis jar包,包括2.4.1,2.5.1等高版本jedis,当我们试图按照以前的方式配置maxActive属性时,或者spring配置文件传入redis.pool.maxActive,项目启动会报错,原因是jedis高版本的JedisPoolConfig没有max

ljz9425的专栏 1万+

EtherCAT主站SOEM -- 15 -- CIA402伺服驱动器子协议

以上就是EtherCAT主站SOEM – 15 – CIA402伺服驱动器子协议的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 2736

整合springboot+redis,一直失败,发现是common-pool2版本问题。

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-03-10 08:30:59.330 ERROR 26904 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATIO...

Mr_Hoga的博客 1万+

LangChain4j + MCP:从工具协议到生产级 Agent

这两年,很多团队都已经把「大模型问答」接入到系统里了:前端一个输入框,后端调一下 OpenAI / DeepSeek / 本地模型,返回一段回答——这类 「简单问答型」AI 功能它只能说,不会做:不会主动查数据库,不会调用你的接口,不会帮你真正执行脚本;面对复杂一点的需求,比如「帮我生成这个报表的 SQL 并执行一下」,普通 ChatGPT 式的问答就开始力不从心了。而Agent 智能体想解决的,就是这件事:不只是回答你「怎么做」,而是能自己思考、自己决定要不要用工具、再用工具把事做完。

OFFTime_we的博客 1154

MobileFusion:基于结构重参数化的移动端红外可见光图像融合方法

MobileFusion提出了一种轻量化的红外与可见光图像融合框架,通过结构重参数化技术实现移动端实时部署。该方法包含可重参数多分支卷积(RepMBConv)、轻量化上下文感知注意力(LCAA)和重参数前馈网络(RepFFN)三大模块,在训练时保留多分支结构增强特征学习,推理时合并为单路算子提升效率。实验表明,MobileFusion在MSRS、FMB等数据集上实现了融合质量与推理速度的平衡,参数量仅4000,在边缘设备上也能高效运行,为资源受限场景提供了实用解决方案。代码已开源。

毕竟是Shy哥 138

apache common pool2原理与实战

简介 对象池顾名思义就是存放对象的池,与我们常听到的线程池、数据库连接池、http连接池等一样,都是典型的池化设计思想。 对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提升复用性,以节约资源的消耗,可以有效避免频繁为对象分配内存和释放堆中内存,进而减轻jvm垃圾收集器的负担,避免内存抖动。 Apache Common Pool2 是Apache提供的一个通用对象池技术实现,可以方便定制化自己需要的对象池,大名鼎鼎的 Redis 客户端 Jedis 内部连接池就是基于它来实现的。

weixin_43511928的博客 2014

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

apache Common Pool2

转载:https://blog.youkuaiyun.com/y4x5m0nivsrjay3x92c/article/details/80016747 我们系统中一般都会存在很多可重用并长期使用的对象,比如线程、TCP 连接、数据库连接等。虽然我们可以简单的在使用这些对象时进行创建、使用结束后销毁,但初始化和销毁对象的操作会造成一些资源消耗。我们可以使用对象池将这些对象集中管理,减少对象初始化和销毁的次数以节...

中国华的博客 4786

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

apache的commons-pool2原理与使用详解

Apache Commons Pool2 是一个高效的对象池化框架,主要用于管理数据库连接、线程等昂贵资源的复用。其核心包括对象池、池化对象和对象工厂三大组件,通过借出/归还机制实现资源生命周期管理。使用步骤包括添加依赖、实现对象工厂、配置池参数和创建池实例。框架提供丰富的配置选项如maxTotal、maxIdle等,支持性能优化和资源泄漏防护。典型应用包括数据库连接池、Redis客户端等,需注意资源释放和线程安全问题。Lettuce等客户端也基于该框架实现连接池功能,可通过YAML或代码配置参数。该框架能

技术人集结地 2354

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

common-pool2

文章目录1、简介2、核心接口3、对象池逻辑分析3.1、对象池接口说明3.2、 对象创建解耦3.2、池对象的状态3.3、对象池相关配置项3.4、对象池源码分析4、对象池`browObject`的逻辑5、对象池`returnObject`的过程执行逻辑6、对象池的自我保护机制7、工厂的`passivateObject(PooledObject p)`和`passivateObject(PooledObject p)`即对象的激活和钝化方法有有什么作用?8、使用步骤9、注意事项 1、简介 对象池就是一种存放对象的

weixin_44457533的博客 1618

从commons pool2到池

转载请注明:http://blog.youkuaiyun.com/HEL_WOR/article/details/51224388 池该如何理解?我们经常提到的数据库连接池,线程池,对象池。池这个概念,在计算机里,应该如何用代码来描述? 在网页上可以找到很多关于数据库连接池的描述,实现DataSource接口,用一个链表或者只要能保存数据的容器将事先创建好的连接保存起来,一个连接池就成型了,在需要使用的时候去

HEL_WOR的博客 2498

Apache-Common-Pool2中对象池的使用方式

Apache Common-Pool2 组件最重要的功能,就是向开发人员提供一个稳定的、高性能的对象池。我们在实际开发过程中最常用、最典型的对象池就是数据库连接池。对象池可以在数据库连接对象被调用前,预先生成和管理一批可以使用的对象,用空间换时间的方式提升应用程序对数据库的操作性能。

JAVA入门中 1912

对象池(连接池):连接池参数、commons-pool2、 GenericObjectPool常用参数详解

为什么会有对象池 在实际的应用工程当中,存在一些被频繁使用的、创建或者销毁比较耗时、持有的资源也比较昂贵的一些对象。比如:数据库连接对象、线程对象。所以如果能够通过一种方式,把这类对象统一管理,让这类对象可以被循环利用的话,就可以减少很多系统开销(内存、CPU、IO等),极大的提升应用性能。 Apache Commons Pool Apache Commons Pool就是一个对象池的框架,他提供了一整套用于实现对象池化的API,以及若干种各具特色的对象池实现。Apache Commons Pool是

老艮头的后知后觉 4211

apache-common-pool2(配置参数详解,以及资源回收,从池中获取资源,将资源返还给池...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34037173的博客 485

apache-common-pool2使用以及(配置参数详解,以及资源回收,从池中获取资源,将资源返还给池)...

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34248705的博客 196

Apache Commons-pool2使用入门

安装项目介绍创建新的对象并初始化的操作,可能会消耗很多的时间。在这种对象的初始化工作包含了一些费时的操作(例如,从一台位于20,000千米以外的主机上读出一些数据)的时候,尤其是这样。在需要大量生成这样的对象的时候,就可能会对性能造成一些不可忽略的影响。要缓解这个问题,除了选用更好的硬件和更棒的虚拟机以外,适当地采用一些能够减少对象创建次数的编码技巧,也是一种有效的对策。

2401_89693896的博客 1817

common-pool2对象池的详解与使用

我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等。在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响。一种办法就是使用对象池,每次创建的对象并不实际销毁,而是缓存在对象池中,下次使用的时候,不用再重新创建,直接从对象池的缓存中取即可。为了避免重新造轮子,我们可以使用优秀的开源对象池化组件apache-co...

石头视角 1109

Apache Commons Pool :介绍与使用

默认情况下,闲置对象不会自动过期,除非设置了逐出线程参数(如设置可以明确指定闲置对象的过期时间。通过调优minIdle和maxIdle可以更好地控制池中对象的生命周期。是一个高效的对象池管理库,广泛用于连接池、线程池等需要管理资源的场景。其配置包括最小闲置数 (minIdle)和逐出线程 (Evictor)参数。最小闲置数 (minIdle定义对象池中需要保持的最小空闲对象数。如果空闲对象少于该值,池会创建新的对象,直到满足minIdle。逐出线程 (Evictor周期性检查并清理空闲对象。

Thinking In Java 2834

对象池(连接池):commons-pool2源码解析:GenericObjectPool的returnObject方法解析

为什么会有对象池 在实际的应用工程当中,存在一些被频繁使用的、创建或者销毁比较耗时、持有的资源也比较昂贵的一些对象。比如:数据库连接对象、线程对象。所以如果能够通过一种方式,把这类对象统一管理,让这类对象可以被循环利用的话,就可以减少很多系统开销(内存、CPU、IO等),极大的提升应用性能。 Apache Commons Pool Apache Commons Pool就是一个对象池的框架,他提供了一整套用于实现对象池化的API,以及若干种各具特色的对象池实现。Apache Commons Pool是很多连

老艮头的后知后觉 3133

apache.commons.pool2 使用指南

apache.commons.pool2 使用指南

AKA石头 1371
上一篇: 基于 java nio 长连接实现的聊天室
下一篇: redis安装,命令详解,配置详解,java客户端如何使用,都在这里
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值