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.mzph.cn/bicheng/68543.shtml

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

相关文章

Vue 中实现修改数组,并保持页面渲染数据是响应式更改

如果你在 Vue 中使用数组并希望确保对数组项的修改是响应式的&#xff0c;直接替换数组项可能不会触发 Vue 的响应式更新。为了确保响应式更新&#xff0c;你可以使用 Vue 提供的 Vue.set() 方法&#xff08;在 Vue 2 中&#xff09;或使用 this.$set() 方法&#xff08;在 Vue…

为什么要内存对齐?

内存对齐 初步认识 内存对齐是什么&#xff1f;从下面的代码可以比较直观地有一个简单的认识&#xff1a; #include <iostream>using namespace std;struct s1 {int i;char c1;char c2; };struct s2 {char c1;int i;char c2; };struct s3 {char c1;char c2;int i; };i…

MySQL HASH索引详解

文章目录 一、定义二、工作原理三、优缺点四、应用场景五、案例及分析 一、定义 HASH索引是一种基于哈希表实现的索引结构。它通过哈希函数将索引键值映射到一个固定长度的哈希值&#xff0c;并将这个哈希值存储在哈希表中。这种索引结构特别适用于等值查询&#xff0c;能够显…

[创业之路-254]:《华为数字化转型之道》-1-华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。

目录 前言&#xff1a; 华为&#xff1a;客户需求牵引下的闭环系统创新 前言&#xff1a; 华为是一个由客户需求牵引、高度数字化、高度智能化、由无数个闭环流程组成的价值创造、评估、分配系统。华为的流程大到战略&#xff0c;小到日常工作&#xff0c;是由无数个自我调节…

【SQL 中的分组查询与联合查询详解】

文章目录 SQL 中的分组查询与联合查询详解1. GROUP BY分组查询1.1 语句格式1.2 示例说明1.2.1 分别查询哥哥组和弟弟组的英语成绩总和1.2.2 查询哥哥组的所有成绩总和 2. 联合查询2.1 内连接2.1.1 语法格式2.1.2 执行过程 2.2 外连接2.2.1 左外连接2.2.2 右外连接 2.3 自连接2.…

《FMambaIR:一种基于混合状态空间模型和频域的方法用于图像恢复》学习笔记

paper&#xff1a;(PDF) FMambaIR: A Hybrid State Space Model and Frequency Domain for Image Restoration 目录 摘要 一、引言 二、相关工作 1、图像恢复 2、频率学习 3、状态空间模型&#xff08;SSM&#xff09; 三、框架 1、基本知识 2、整体框架 3、F-Mamba…

Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20241230

逐笔委托逐笔成交下载 链接: https://pan.baidu.com/s/11Tdq06bbYX4ID9dEaiv_lQ?pwdcge6 提取码: cge6 Level2逐笔成交逐笔委托数据分享下载 利用Level2的逐笔交易和委托数据&#xff0c;这种以毫秒为单位的详细信息能揭露众多关键信息&#xff0c;如庄家意图、伪装行为&…

51c自动驾驶~合集47

我自己的原文哦~ https://blog.51cto.com/whaosoft/13083194 #DreamDrive 性能爆拉30%&#xff01;英伟达&#xff1a;时空一致下的生成重建大一统新方案~ 从自车的驾驶轨迹中生成真实的视觉图像是实现自动驾驶模型可扩展训练的关键一步。基于重建的方法从log中生成3D场景…

AI 编程工具—Cursor 对话模式详解 Chat、Composer 与 Normal/Agent 模式

Cursor AI 对话模式详解:Chat、Composer 与 Normal/Agent 模式 一、简介 Cursor 是一个强大的 AI 辅助编程工具,它提供了多种对话模式来满足不同的开发需求。主要包括: Chat 模式:直接对话交互Composer 模式:结构化编程助手Normal/Agent 模式:不同的 AI 响应策略打开Ch…

SpringBoot项目打war包要点

1. 修改pom文件packaging 2. 不使用内置tomcat 3. 加一个类 4. 修改外部tomcat配置文件 5. 修改nginx配置文件&#xff0c;构建集群 资料来自网络

GMM高斯混合聚类算法(Matlab)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GMM高斯混合聚类算法 matlab2023b语言&#xff0c;一键出图&#xff0c;直接运行 1.代码注释清晰&#xff0c;自行解读容易。 2…输出图例如图所示包括&#xff1a;聚类图(聚类结果图)&#xff0c;协方差矩阵类型…

华为数据中心CE系列交换机级联M-LAG配置示例

M-LAG组网简介 M-LAG&#xff08;Multi-chassis Link Aggregation&#xff09;技术是一种跨设备的链路聚合技术&#xff0c;它通过将两台交换机组成一个逻辑设备&#xff0c;实现链路的负载分担和故障切换&#xff0c;从而提高网络的可靠性和稳定性。下面给大家详细介绍如何在…

Vue2.0的安装

1.首先查看是否已经安装了node.js 选择以管理员方式打开命令提示符&#xff08;权限较高&#xff09;&#xff0c;或者通过cmd的方式打开 打开后输入node -v 查看自己电脑是否安装node&#xff0c;以及版本号 node -v 如果没有的话&#xff0c;请查看Node.js的安装 2.Vue和脚…

GAN 用于图像增强

工程需求&#xff0c;临时学一下gan的原理和基于图像增强的实现 原理 论文链接 Generative Adversarial Nets 我们提出了一个通过对抗过程来估计生成模型的新框架&#xff0c;其中我们同时训练两个模型&#xff1a;捕获数据分布的生成模型G和估计样本来自训练数据而不是G的…

【深度学习】傅里叶变换

[toc]深度学习中的傅里叶变换 傅里叶变换 傅里叶变换在深度学习中有着广泛的应用&#xff0c;尤其是在信号处理、图像处理和自然语言处理等领域。 1. 傅里叶变换基础 傅里叶变换是一种将信号从时域转换到频域的数学工具。对于连续信号&#xff0c;傅里叶变换定义为&#xf…

免费的数据标注工具

1. LabelImg&#xff08;图像标注工具&#xff09; 推荐理由&#xff1a;LabelImg 是一个开源、跨平台的图像标注工具&#xff0c;广泛用于物体检测任务。支持对图像进行框选标注&#xff0c;支持多种文件格式&#xff08;如Pascal VOC、YOLO格式&#xff09;。它非常轻量&…

sqlfather笔记

这里简单记录写学习鱼皮sqlfather项目的笔记&#xff0c;以供以后学习。 运行 将前后端项目clone到本地后&#xff0c;修改对应配置文件运行项目。 后端 1.配置好mysql后运行这个sql文件建立对应的表。 2.修改数据库密码 3.修改完后运行启动类即可 4. 启动结果 5.查看A…

【大数据】机器学习------支持向量机(SVM)

支持向量机的基本概念和数学公式&#xff1a; 1. 线性可分的支持向量机 对于线性可分的数据集 &#xff0c;其中(x_i \in R^d) 是特征向量 是类别标签&#xff0c;目标是找到一个超平面 &#xff0c;使得对于所有 的样本 &#xff0c;对于所有(y_i -1) 的样本&#xff0c;…

《AI与鸿蒙Next:建筑设计可视化的革新力量》

在建筑设计领域&#xff0c;可视化对于呈现设计理念、与客户沟通以及指导施工等环节都至关重要。人工智能与鸿蒙Next图形渲染技术的发展&#xff0c;为建筑设计可视化带来了前所未有的变革与机遇。 人工智能在建筑设计可视化中的作用 快速生成设计方案&#xff1a;人工智能可以…

Android系统开发(一):AOSP 架构全解析:开源拥抱安卓未来

引言 当我们手握智能手机&#xff0c;流畅地滑动屏幕、切换应用、欣赏动画时&#xff0c;背后其实藏着一套庞大且精密的开源系统——Android AOSP&#xff08;Android Open Source Project&#xff09;。这套系统不仅是所有安卓设备的根基&#xff0c;也是系统开发者的终极 pl…