apache的commons-pool2原理与使用详解
Apache Commons Pool2 是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能。
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。
点击跳转到网站
一、核心原理与组件
-
三大核心模块
• ObjectPool(对象池)管理对象的生命周期,提供
borrowObject()
(借出)和returnObject()
(归还)方法,内部通过LinkedBlockingDeque
维护空闲对象队列,并支持LIFO(默认)或FIFO策略。
• PooledObject(池化对象)对原生对象的包装类(如
DefaultPooledObject
),记录对象状态(IDLE、ALLOCATED、EVICTION等)、创建时间、最后使用时间等元数据,便于池管理。
• PooledObjectFactory(对象工厂)定义对象创建、销毁、验证等逻辑,需用户实现以下方法:
◦makeObject()
:创建新对象并包装为PooledObject
;◦
destroyObject()
:销毁不再可用的对象;◦
validateObject()
:检查对象是否有效;◦
activateObject()
/passivateObject()
:激活或钝化对象状态(如重置连接)。 -
对象生命周期管理流程
• 借出对象:-
检查空闲队列是否存在有效对象;
-
若无效则销毁,并创建新对象(未达
maxTotal
上限时); -
返回对象前调用
activateObject()
激活。
• 归还对象: -
调用
validateObject()
验证有效性; -
若有效则
passivateObject()
钝化后放回空闲队列; -
若空闲对象超过
maxIdle
或池已关闭,则销毁对象。
-
二、使用步骤详解(以数据库连接池为例)
-
添加依赖
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version> </dependency>
-
实现对象工厂
public class ConnectionFactory extends BasePooledObjectFactory<Connection> {@Overridepublic Connection create() throws Exception {return DriverManager.getConnection("jdbc:mysql://localhost:3306/test");}@Overridepublic PooledObject<Connection> wrap(Connection conn) {return new DefaultPooledObject<>(conn);}@Overridepublic boolean validateObject(PooledObject<Connection> p) {return p.getObject().isValid(5); // 检查连接有效性} }
-
配置对象池参数
GenericObjectPoolConfig<Connection> config = new GenericObjectPoolConfig<>(); config.setMaxTotal(50); // 最大对象数 config.setMaxIdle(10); // 最大空闲数 config.setMinIdle(5); // 最小空闲数 config.setTestWhileIdle(true); // 空闲时定期验证 config.setTimeBetweenEvictionRunsMillis(30000); // 驱逐检查周期
-
创建池实例并操作
ObjectPool<Connection> pool = new GenericObjectPool<>(new ConnectionFactory(), config); // 借出对象 Connection conn = pool.borrowObject(); // 使用对象执行SQL... // 归还对象 pool.returnObject(conn);
三、高级配置与优化
-
关键参数解析
参数名 作用 maxTotal
池中最大对象数,防止资源耗尽 maxIdle
/minIdle
控制空闲对象数量,平衡资源占用与快速响应 testOnBorrow
/testOnReturn
借出或归还时验证对象有效性,确保可用性但增加延迟 blockWhenExhausted
资源耗尽时是否阻塞等待( maxWaitMillis
设置超时时间) -
性能优化建议
• 避免频繁驱逐:设置较长的timeBetweenEvictionRunsMillis
(如30秒),减少检查开销。• 异步操作支持:通过
GenericObjectPool
的异步方法提升高并发场景下的吞吐量。• 资源泄漏防护:结合
LeakDetectionHandler
监控未归还的对象,设置removeAbandonedTimeout
自动回收。
四、典型应用场景
- 数据库连接池
如DBCP、HikariCP底层依赖Commons Pool2,复用连接减少TCP握手开销。 - Redis客户端连接池
Jedis通过JedisPool
管理连接,避免频繁创建Socket。 - FTP连接池
复用FTPClient对象,减少登录/注销开销(需实现activateObject
重置连接状态)。 - 自定义资源池
如线程池、内存缓存对象池,适用于创建成本高的对象。
五、注意事项与最佳实践
- 资源泄漏处理
在finally
块中确保returnObject()
调用,或使用try-with-resources
模式包装池对象。 - 异常管理
捕获destroyObject()
中的异常,避免因个别对象销毁失败影响整体池稳定性。 - 线程安全
GenericObjectPool
内部通过锁机制保证并发安全,但自定义工厂需确保create()
等方法的线程安全性。
六、Lettuce 使用 Apache Commons Pool2
Lettuce 是 Spring Boot 默认的 Redis 客户端,其本身通过 commons-pool2
提供连接池支持,适用于需要控制连接复用或处理阻塞操作的场景。以下是基于 commons-pool2
的 Lettuce 连接池完整使用实例及关键要点:
1、核心依赖配置
Lettuce 连接池依赖 commons-pool2
,需在项目中显式引入:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version>
</dependency>
若未添加此依赖,连接池功能将无法启用。
2、连接池参数配置(YAML 示例)
在 Spring Boot 的 application.yml
中配置连接池参数:
spring:redis:host: 127.0.0.1port: 6379lettuce:pool:max-active: 20 # 最大活跃连接数max-idle: 10 # 最大空闲连接min-idle: 5 # 最小空闲连接max-wait: 5000ms # 获取连接最大等待时间time-between-eviction-runs: 30000ms # 空闲连接检查周期
此配置会通过 LettuceConnectionFactory
自动创建连接池实例。
3、代码实例:手动创建连接池
对于非 Spring 环境或需要自定义的场景,可手动创建 GenericObjectPool
:
// 创建 RedisClient
RedisClient client = RedisClient.create("redis://localhost:6379");// 配置连接池参数
GenericObjectPoolConfig<StatefulRedisConnection<String, String>> poolConfig = new GenericObjectPoolConfig<>();
poolConfig.setMaxTotal(20);
poolConfig.setMaxIdle(10);
poolConfig.setMinIdle(5);// 创建连接池(包装连接模式)
GenericObjectPool<StatefulRedisConnection<String, String>> pool = ConnectionPoolSupport.createGenericObjectPool(() -> client.connect(), // 连接工厂poolConfig,true // 包装连接,close() 自动归还
);// 使用示例
try (StatefulRedisConnection<String, String> connection = pool.borrowObject()) {RedisCommands<String, String> commands = connection.sync();commands.set("key", "value");
} // 此处自动调用 close() 归还连接到池中
• 包装模式(wrapConnections=true
):调用 connection.close()
时自动归还连接。
• 直接模式(wrapConnections=false
):需手动调用 pool.returnObject(connection)
归还。
4、连接池生效验证
-
性能对比
插入大量数据时,开启连接池的执行速度显著快于单连接(如 1W 条数据耗时减少 30%+)。 -
连接数监控
使用redis-cli info clients
或 Linux 命令lsof -i:6379
查看实际连接数。初始可能仅 1 个连接,随压力增加逐步升至max-active
,空闲后逐步回收至min-idle
。
5、关键注意事项
-
共享连接开关
Spring Boot 默认开启shareNativeConnection
,需在配置类中关闭以强制使用连接池:@Bean public LettuceConnectionFactory lettuceConnectionFactory() {LettuceConnectionFactory factory = new LettuceConnectionFactory();factory.setShareNativeConnection(false); // 禁用共享连接return factory; }
否则连接池配置可能不生效。
-
阻塞操作与事务
涉及BLPOP
、事务(MULTI/EXEC
)等阻塞操作时,必须使用连接池避免线程阻塞。 -
异常处理
• 确保borrowObject()
和returnObject()
在try-finally
块中调用,防止连接泄漏。• 捕获
RedisConnectionException
处理连接失效问题,配置testWhileIdle
定期验证连接有效性。
6、扩展配置项
参数名 | 作用 | 默认值 |
---|---|---|
max-active | 最大活跃连接数(并发上限) | 8 |
min-idle | 最小空闲连接(预热保留) | 0 |
max-wait | 获取连接超时时间(-1 表示无限等待) | -1 |
time-between-eviction-runs | 空闲连接驱逐检查周期 | 禁用 |
test-on-borrow | 借出时是否验证连接有效性 | false |
Lettuce 通过 commons-pool2
实现灵活连接池管理,适用于高并发或需要资源隔离的场景。在 Spring Boot 中通过 YAML 配置即可快速启用,非 Spring 项目则需手动创建 GenericObjectPool
并管理连接生命周期。关键点在于正确关闭共享连接、验证池化效果及处理阻塞操作,以充分发挥连接池的性能优势。
总结
Apache Commons Pool2通过标准化的对象池管理机制,显著提升了高成本资源的使用效率。其核心在于对象复用与生命周期控制,结合灵活的配置参数,可广泛应用于数据库、网络连接等场景。开发者需重点掌握工厂实现、池配置优化及异常处理,以构建高性能、稳定的资源池。
Lettuce使用详解
相关文章:

apache的commons-pool2原理与使用详解
Apache Commons Pool2 是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能。 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击…...

打印Yolo预训练模型的所有类别及对应的id
有时候我们可能只需要用yolo模型检测个别类别,并显示,这就需要知道id,以下代码可打印出 from ultralytics import YOLO# 加载模型 model YOLO(yolo11x.pt)# 打印所有类别名称及其对应的ID print(model.names) {0: person, 1: bicycle, 2: c…...
语法糖介绍(C++ Python)
语法糖(Syntactic Sugar)是编程语言中为了提升代码可读性和简洁性而设计的语法结构。它不改变语言的功能,但能让代码更易写和理解。以下是 C 和 Python 中常见的语法糖示例: C 中的常见语法糖 范围 for 循环(Range-bas…...
事务详解及面试常考知识点整理
事务详解及面试常考知识点整理 1. 什么是事务? **事务(Transaction)**是将多条 SQL 语句打包执行的操作单元,具有“一气呵成”的特性。就好比你要完成“把大象放进冰箱”这件事,一共分三步: 打开冰箱门把…...

设计模式26——解释器模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 解释器模式(Interp…...

在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.3,运行demo,显示label
在MDK中自动部署LVGL,在stm32f407ZGT6移植LVGL-8.3 一、硬件平台二、实现功能三、移植步骤1、下载LVGL-8.42、MDK中安装LVGL-8.43、配置RTE4、配置头文件 lv_conf_cmsis.h5、配置lv_port_disp_template 四、添加心跳相关文件1、在STM32CubeMX中配置TIM7的参数2、使能…...

ArcGIS 与 HEC-RAS 协同:流域水文分析与洪水模拟全流程
技术点目录 洪水淹没危险性评价方法及技术介绍基于ArcGIS的水文分析基于HecRAS淹没模拟的洪水危险性评价洪水风险评价综合案例分析应用了解更多 —————————————————————————————————————————————————— 前言综述 洪水危险性及…...
树莓派设置静态ip 永久有效 我的需要设置三个 一个摄像头的 两个设备的
通过 systemd-networkd 配置 此方法适用于较新的Raspberry Pi OS版本,支持同时绑定多个IP地址到同一网卡,且配置清晰稳定。 1.禁用DHCP客户端对eth0的管理:编辑/etc/dhcpcd.conf文件,添加以下内容以忽略eth0接口的自动分配 sudo nano /etc…...

多模态大语言模型arxiv论文略读(九十九)
PartGLEE: A Foundation Model for Recognizing and Parsing Any Objects ➡️ 论文标题:PartGLEE: A Foundation Model for Recognizing and Parsing Any Objects ➡️ 论文作者:Junyi Li, Junfeng Wu, Weizhi Zhao, Song Bai, Xiang Bai ➡️ 研究机构…...

Fine-tuning:微调技术,训练方式,LLaMA-Factory,ms-swift
1,微调技术 特征Full-tuningFreeze-tuningLoRAQLoRA训练参数量全部少量极少极少显存需求高低很低最低模型性能最佳中等较好接近 LoRA模型修改方式无变化局部冻结插入模块量化插入模块多任务共享不便较便非常适合非常适合适合超大模型微调❌✅✅✅(最优&…...
vscode连接的linux服务器,上传项目至github
问题 已将项目整个文件夹拷贝到克隆下来的文件夹中,并添加了所有文件,并修改了commit -m,使用git push -u origin main提交的时候会出现vscode请求登录github,确定之后需要等待很久,也无果 原因 由于 远程服务器无法…...

XCTF-web-mfw
发现了git 使用GitHack下载一下源文件,找到了php源代码 <?phpif (isset($_GET[page])) {$page $_GET[page]; } else {$page "home"; }$file "templates/" . $page . ".php";// I heard .. is dangerous! assert("strpos…...
indel_snp_ssr_primer
indel标记使用 1.得到vcf文件 2.提取指定区域vcf文件并压缩构建索引 bcftools view -r <CHROM>:<START>-<END> input.vcf -o output.vcf bgzip -c all.filtered.indel.vcf > all.filtered.indel.vcf.gz tabix -p vcf all.filtered.indel.vcf.gz3.准备参…...
图论核心:深度搜索DFS 与广度搜索BFS
一、深度优先搜索(DFS):一条路走到黑的探索哲学 1. 算法核心思想 DFS(Depth-First Search)遵循 “深度优先” 原则,从起始节点出发,尽可能深入地访问每个分支,直到无法继续时回溯&a…...
Java 调用 HTTP 和 HTTPS 的方式详解
文章目录 1. HTTP 和 HTTPS 基础知识1.1 什么是 HTTP/HTTPS?1.2 HTTP 请求与响应结构1.3 常见的 HTTP 方法1.4 常见的 HTTP 状态码 2. Java 原生 HTTP 客户端2.1 使用 URLConnection 和 HttpURLConnection2.1.1 基本 GET 请求2.1.2 基本 POST 请求2.1.3 处理 HTTPS …...
Redis--基础知识点--28--慢查询相关
1 慢查询的原因 1.1 非命令数据相关原因 1.1.1 网络延迟 原因:客户端与 Redis 服务器之间的网络延迟可能导致客户端感知到的响应时间变长。 解决方案:优化网络环境 排查: 1.1.2 CPU 竞争 原因:Redis 是单线程的,…...
目标检测:YOLO 模型详解
目录 一、YOLO(You Only Look Once)模型讲解 YOLOv1 YOLOv2 (YOLO9000) YOLOv3 YOLOv4 YOLOv5 YOLOv6 YOLOv7 YOLOv8 YOLOv9 YOLOv10 YOLOv11 YOLOv12 其他变体:PP-YOLO 二、YOLO 模型的 Backbone:Focus 结构 三、…...
HDFS存储原理与MapReduce计算模型
HDFS存储原理 1. 架构设计 主从架构:包含一个NameNode(主节点)和多个DataNode(从节点)。 NameNode:管理元数据(文件目录结构、文件块映射、块位置信息),不存储实际数据…...

电机控制选 STM32 还是 DSP?技术选型背后的现实博弈
现在搞电机控制,圈里人都门儿清 —— 主流方案早就被 STM32 这些 Cortex-M 单片机给拿捏了。可要是撞上系统里的老甲方,技术认知还停留在诺基亚砸核桃的年代,非揪着 DSP 不放,咱也只能赔笑脸:“您老说的对,…...

.NET 开源工业视觉系统 OpenIVS 快速搭建自动化检测平台
前言 随着工业4.0和智能制造的发展,工业视觉在质检、定位、识别等场景中发挥着越来越重要的作用。然而,开发一个完整的工业视觉系统往往需要集成相机控制、图像采集、图像处理、AI推理、PLC通信等多个模块,这对开发人员提出了较高的技术要求…...
从0到1掌握Kotlin高阶函数:开启Android开发新境界!
简介 在当今的Android开发领域,Kotlin已成为开发者们的首选编程语言。其高阶函数特性更是为代码的编写带来了极大的灵活性和简洁性。本文将深入探讨Kotlin中的高阶函数,从基础概念到实际应用,结合详细的代码示例和mermaid图表,为你呈现一个全面且深入的学习指南。无论你是…...
【OSS】 前端如何直接上传到OSS 上返回https链接,如果做到OSS图片资源加密访问
使用阿里云OSS(对象存储服务)进行前端直接上传并返回HTTPS链接,同时实现图片资源的加密访问,可以通过以下步骤实现: 前端直接上传到OSS并返回HTTPS链接 设置OSS Bucket: 确保你的OSS Bucket已创建…...

AI智能分析网关V4室内消防逃生通道占用检测算法打造住宅/商业/工业园区等场景应用方案
一、方案背景 火灾严重威胁生命财产安全,消防逃生通道畅通是人员疏散的关键。但现实中通道被占用、堵塞现象频发,传统人工巡查监管效率低、不及时。AI智能分析网关V4结合消防逃生通道占用算法,以强大的图像识别和数据分析能力,…...
商城前端监控体系搭建:基于 Sentry + Lighthouse + ELK 的全链路监控实践
在电商行业,用户体验直接关乎转化率和用户留存。一个页面加载延迟1秒可能导致7%的订单流失,一次未捕获的前端错误可能引发用户信任危机。如何构建一套高效的前端监控体系,实现错误实时追踪、性能深度优化与数据可视化分析?本文将揭…...
Kotlin 中的数据类型有隐式转换吗?为什么?
在 Kotlin 中,基本数据类型没有隐式转换。主要出于安全性和明确性的考虑。 1 Kotlin 的显式类型转换规则 Kotlin 要求开发者显式调用转换函数进行类型转换, 例如: val a: Int 10 val b: Long a.toLong() // 必须显式调用 toLong() // 错…...
基于 HTTP 的邮件认证深入解读 ngx_mail_auth_http_module
一、模块启用与示例配置 mail {server {listen 143; # IMAPprotocol imap;auth_http http://auth.local/auth;# 可选:传递客户端证书给认证服务auth_http_pass_client_cert on;auth_http_timeout 5s;auth_http_header X-Auth-Key "shared_se…...

关于无法下载Qt离线安装包的说明
不知道出于什么原因考虑,Qt官方目前不提供离线的安装包下载,意味着网上各种文章提供的各种下载地址都失效了,会提示Download from your IP address is not allowed,当然目前可以在线安装,但是据说只提供了从5.15开始的…...

Java开发经验——阿里巴巴编码规范实践解析4
摘要 本文主要介绍了阿里巴巴编码规范中关于日志处理的相关实践解析。强调了使用日志框架(如 SLF4J、JCL)而非直接使用日志系统(如 Log4j、Logback)的 API 的重要性,包括解耦日志实现、统一日志调用方式等好处。同时&…...

HTML应用指南:利用GET请求获取全国捞王锅物料理门店位置信息
随着新零售业态的快速发展,门店位置信息的获取变得越来越重要。作为知名中式餐饮品牌之一,捞王锅物料理自2009年创立以来,始终致力于为消费者提供高品质的锅物料理与贴心的服务体验。经过多年的发展,捞王在全国范围内不断拓展门店…...

算法日记32:埃式筛、gcd和lcm、快速幂、乘法逆元
一、埃式筛(计算质数) 1.1、概念 1.1.1、在传统的计算质数中,我们采用单点判断,即判断(2~sqrt(n))是否存在不合法元素,若存在则判否,否则判是 1.1.2、假设,此时我们需要求1~1000的所有质数&am…...