Java 对象池管理的高性能工具库 Apache Commons Pool 2

Apache Commons Pool 2 是一个用于对象池管理的高性能工具库,主要用于管理复用昂贵的对象(如数据库连接、网络连接、线程等)。它实现了常见的对象池模式,可以通过配置来优化资源的分配与回收。


Maven 依赖

在项目中添加 commons-pool2 的依赖:

<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>2.11.1</version> <!-- 使用最新版本 -->
</dependency>

核心概念

  1. PooledObjectFactory:对象池中对象的创建和销毁管理接口。
  2. ObjectPool:对象池接口,负责对象的借用与归还。
  3. GenericObjectPool:通用对象池实现,最常用的对象池类。
  4. GenericKeyedObjectPool:支持多个键值的对象池管理。

使用步骤

1. 定义对象的工厂类

创建一个工厂类,继承 BasePooledObjectFactory 或实现 PooledObjectFactory 接口,用于管理对象的创建、销毁、激活等生命周期。

import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;// 定义池化对象的工厂
public class MyObjectFactory extends BasePooledObjectFactory<MyObject> {@Overridepublic MyObject create() {return new MyObject(); // 创建对象}@Overridepublic PooledObject<MyObject> wrap(MyObject obj) {return new DefaultPooledObject<>(obj); // 包装成池化对象}@Overridepublic void destroyObject(PooledObject<MyObject> p) {System.out.println("Destroying object: " + p.getObject());}
}// 自定义对象
class MyObject {public void doSomething() {System.out.println("Working...");}
}

2. 创建对象池

使用 GenericObjectPool 进行对象池管理。

import org.apache.commons.pool2.impl.GenericObjectPool;public class ObjectPoolExample {public static void main(String[] args) throws Exception {// 创建对象池GenericObjectPool<MyObject> pool = new GenericObjectPool<>(new MyObjectFactory());// 配置对象池pool.setMaxTotal(5); // 最大对象数pool.setMinIdle(2); // 最小空闲对象数// 借用对象MyObject obj = pool.borrowObject();obj.doSomething();// 归还对象pool.returnObject(obj);// 关闭池pool.close();}
}

对象池配置参数

对象池(GenericObjectPool)提供了一些常见的配置项,用于优化资源使用:

配置项作用
setMaxTotal(int)池中最大对象数,默认值为 8。
setMinIdle(int)池中最小空闲对象数,当对象数低于此值时,池会尝试创建新对象。
setMaxIdle(int)池中最大空闲对象数,超过此值的对象会被销毁。
setMaxWaitMillis(long)从池中借用对象时的最大等待时间,超过此时间会抛出 NoSuchElementException
setBlockWhenExhausted(boolean)是否在对象耗尽时阻塞等待,默认值为 true
setTestOnBorrow(boolean)借用对象时是否验证对象有效性,默认值为 false
setTestOnReturn(boolean)归还对象时是否验证对象有效性,默认值为 false
setTestWhileIdle(boolean)空闲时是否验证对象有效性,默认值为 false

高级用法

1. 带键的对象池 (GenericKeyedObjectPool)

如果需要根据键来区分不同的对象池,可以使用 GenericKeyedObjectPool

import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
import org.apache.commons.pool2.BaseKeyedPooledObjectFactory;// 定义带键的对象工厂
class KeyedObjectFactory extends BaseKeyedPooledObjectFactory<String, MyObject> {@Overridepublic MyObject create(String key) {return new MyObject(); // 根据键创建对象}@Overridepublic PooledObject<MyObject> wrap(MyObject obj) {return new DefaultPooledObject<>(obj);}
}public class KeyedObjectPoolExample {public static void main(String[] args) throws Exception {// 创建带键的对象池GenericKeyedObjectPool<String, MyObject> pool = new GenericKeyedObjectPool<>(new KeyedObjectFactory());// 借用对象MyObject obj1 = pool.borrowObject("key1");MyObject obj2 = pool.borrowObject("key2");obj1.doSomething();obj2.doSomething();// 归还对象pool.returnObject("key1", obj1);pool.returnObject("key2", obj2);// 关闭池pool.close();}
}

2. 对象池的销毁和验证

通过自定义工厂方法,实现销毁和验证逻辑:

import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;class CustomObjectFactory extends BasePooledObjectFactory<MyObject> {@Overridepublic MyObject create() {return new MyObject();}@Overridepublic PooledObject<MyObject> wrap(MyObject obj) {return new DefaultPooledObject<>(obj);}@Overridepublic void destroyObject(PooledObject<MyObject> p) {System.out.println("Destroying object: " + p.getObject());}@Overridepublic boolean validateObject(PooledObject<MyObject> p) {// 验证对象有效性return true; // 根据需求实现具体逻辑}
}

典型应用场景

  1. 数据库连接池
    使用 commons-dbcp2 或类似框架,可以结合 commons-pool2 管理数据库连接。

  2. 网络连接池
    通过对象池管理网络连接资源,避免频繁创建和销毁连接。

  3. 线程池管理
    配合自定义线程对象,实现线程池的资源复用。

  4. 复杂对象的池化
    管理需要频繁创建、销毁但初始化成本高的对象(如大内存对象)。


总结

commons-pool2 是一个高性能、灵活的对象池管理工具,适用于以下场景:

  • 管理需要复用的昂贵对象。
  • 提高资源使用效率,降低系统资源开销。
  • 提供灵活的配置和自定义生命周期管理。

它与其他 Apache 工具库(如 DBCP 数据库连接池)无缝集成,也可以单独用于其他资源池管理需求。

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

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

相关文章

Go 切片:用法和本质

要想更好的了解一个知识点&#xff0c;实战是最好的经历。 题目 我这里放一道题目&#xff1a; package mainimport "fmt"func SliceRise(s []int) {s append(s, 0)for i : range s {s[i]}fmt.Println(s) }func SlicePrint() {s1 : []int{1, 2}s2 : s1s2 append…

蓝桥杯备考:堆和priority queue(优先级队列)

堆的定义 heap堆是一种特殊的完全二叉树&#xff0c;对于树中的每个结点&#xff0c;如果该结点的权值大于等于孩子结点的权值&#xff0c;就称它为大根堆&#xff0c;小于等于就叫小根堆&#xff0c;如果是大根堆&#xff0c;每个子树也是符合大根堆的特征的&#xff0c;如果是…

快速搭建深度学习环境(Linux:miniconda+pytorch+jupyter notebook)

本文基于服务器端环境展开&#xff0c;使用的虚拟终端为Xshell。 miniconda miniconda是Anaconda的轻量版&#xff0c;仅包含Conda和Python&#xff0c;如果只做深度学习&#xff0c;可使用miniconda。 [注]&#xff1a;Anaconda、Conda与Miniconda Conda&#xff1a;创建和管…

springboot医院信管系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

《自动驾驶与机器人中的SLAM技术》ch8:基于预积分和图优化的紧耦合 LIO 系统

和组合导航一样&#xff0c;也可以通过预积分 IMU 因子加上雷达残差来实现基于预积分和图优化的紧耦合 LIO 系统。一些现代的 Lidar SLAM 系统也采用了这种方式。相比滤波器方法来说&#xff0c;预积分因子可以更方便地整合到现有的优化框架中&#xff0c;从开发到实现都更为便…

微信消息群发(定时群发)-UI自动化产品(基于.Net平台+C#)

整理 | 小耕家的喵大仙 出品 | CSDN&#xff08;ID&#xff1a;lichao19897314&#xff09; 关联源码及工具下载https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/lichao19897314/90096681https://download.csdn.net/download/…

ESP8266-01S、手机、STM32连接

1、ESP8266-01S的工作原理 1.1、AP和STA ESP8266-01S为WIFI的透传模块&#xff0c;主要模式如下图&#xff1a; 上节说到&#xff0c;我们需要用到AT固件进行局域网应用&#xff08;ESP8266连接的STM32和手机进行连接&#xff09;。 ESP8266为一个WiFi透传模块&#xff0c;和…

动手学大数据-3社区开源实践

目录 数据库概览&#xff1a; MaxComput&#xff1a; HAWQ&#xff1a; Hologres&#xff1a; TiDB&#xff1a; Spark&#xff1a; ClickHouse&#xff1a; Apache Calcite 概览 Calcite RBO HepPlanner 优化规则&#xff08;Rule&#xff09; 内置有100优化规则 …

WPS数据分析000004

目录 一、表格阅读技巧 冻结窗格 拆分窗口 新建窗口 阅读模式 护眼模式 二、表格打印技巧 打印预览 打印缩放 打印区域 打印标题 分页打印 打印位置 页眉页脚 逐份打印 三、表格保护技巧 锁定单元格 隐藏公式 文档权限 文件加密 一、表格阅读技巧 冻结窗…

【Android】蓝牙电话HFP连接源码分析

一、概述 在Android系统中&#xff0c;HF&#xff08;Hands-Free Profile&#xff09;客户端与AG&#xff08;Audio Gateway&#xff09;端之间的HFP&#xff08;Hands-Free Profile&#xff09;连接是蓝牙音频通信的重要组成部分。这一过程涉及多个层次和组件的协同工作&…

Redisson发布订阅学习

介绍 Redisson 的消息订阅功能遵循 Redis 的发布/订阅模式&#xff0c;该模式包括以下几个核心概念&#xff1a; 发布者&#xff08;Publisher&#xff09;&#xff1a;发送消息到特定频道的客户端。在 Redis 中&#xff0c;这通过 PUBLISH 命令实现。 订阅者&#xff08;Sub…

【Linux 重装】Ubuntu 启动盘 U盘无法被识别,如何处理?

背景 U盘烧录了 Ubuntu 系统作为启动盘&#xff0c;再次插入电脑后无法被识别 解决方案&#xff08;Mac 适用&#xff09; &#xff08;1&#xff09;查找 USB&#xff0c;&#xff08;2&#xff09;格式化&#xff08;1&#xff09;在 terminal 中通过 diskutil list 查看是…

【LLM-RL】DeepSeekMath强化对齐之GRPO算法

note 文章目录 note一、GRPOReference 一、GRPO 论文&#xff1a;DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models &#xff08;https://arxiv.org/pdf/2402.03300&#xff09;GRPO 在 DeepSeek V2 中采用了&#xff0c;GRPO 在训练过程…

Rust Actix Web 项目实战教程 mysql redis swagger:构建用户管理系统

Rust Actix Web 项目实战教程&#xff1a;构建用户管理系统 项目概述 本教程将指导你使用 Rust 和 Actix Web 构建一个完整的用户管理系统&#xff0c;包括数据库交互、Redis 缓存和 Swagger UI 文档。 技术栈 Rust 编程语言Actix Web 框架SQLx (MySQL 数据库)Redis 缓存Uto…

git系列之revert回滚

1. Git 使用cherry-pick“摘樱桃” step 1&#xff1a; 本地切到远程分支&#xff0c;对齐要对齐的base分支&#xff0c;举例子 localmap git pull git reset --hard localmap 对应的commit idstep 2&#xff1a; 执行cherry-pick命令 git cherry-pick abc123这样就会将远程…

Hadoop•用Web UI查看Hadoop状态词频统计

听说这里是目录哦 通过Web UI查看Hadoop运行状态&#x1f407;一、关闭防火墙二、在物理计算机添加集群的IP映射三、启动集群四、进入HDFS的Web UI 词频统计&#x1f9a9;1、准备文本数据2、在HDFS创建目录3、上传文件4、查看文件是否上传成功5、运行MapReduce程序6、查看MapRe…

国产编辑器EverEdit -重复行

1 重复行 1.1 应用场景 在代码或文本编辑过程中&#xff0c; 经常需要快速复制当前行&#xff0c;比如&#xff0c;给对象的多个属性进行赋值。传统的做法是&#xff1a;选中行-> 复制-> 插入新行-> 粘贴&#xff0c;该操作有4个步骤&#xff0c;非常繁琐。 那有没…

LabVIEW桥接传感器数据采集与校准程序

该程序设计用于采集来自桥接传感器的数据&#xff0c;执行必要的设置&#xff08;如桥接配置、信号采集参数、时间与触发设置&#xff09;&#xff0c;并进行适当的标定和偏移校正&#xff0c;最终通过图表呈现采集到的数据信息。程序包括多个模块&#xff0c;用于配置通道、触…

redis-排查命中率降低问题

1.命中率降低带来的问题 高并发系统&#xff0c;当命中率低于平常的的运行情况&#xff0c;或者低于70%时&#xff0c;会产生2个影响。 有大量的请求需要查DB&#xff0c;加大DB的压力&#xff1b;影响redis自身的性能 不同的业务场景&#xff0c;阈值不一样&#xff0c;一般…

edge浏览器恢复旧版滚动条

1、地址栏输入edge://flags 2、搜索Fluent scrollbars.&#xff0c;选择disabled&#xff0c;重启即可