Apache Commons Pool2—Java对象池的利器

news2024/12/28 5:37:12

在日常开发中,为了提高系统性能,避免重复创建和销毁资源,我们经常需要使用对象池技术。Apache Commons Pool2 是 Java 生态中一个强大且易用的对象池实现,它为我们提供了灵活的对象管理功能。本文将带你深入了解 Commons Pool2 的基本用法及其核心特性。


1. 什么是对象池?

对象池是一种设计模式,用于管理和复用对象实例。当创建和销毁对象的代价较高时,使用对象池可以显著提升性能。对象池预先创建一组对象,并在需要时将其分配给客户端,而不是每次都新建对象。


2. Commons Pool2 的基本组件

Commons Pool2 提供了几个核心组件:

  1. ObjectPool:对象池接口,用于定义对象的借用、归还、销毁等操作。

  2. PooledObject:封装池化对象及其状态的包装类。

  3. PooledObjectFactory:对象工厂接口,用于定义对象的创建、销毁和验证逻辑。

  4. BaseObjectPoolConfig:池的配置类,允许我们调整池的行为参数。


3. 快速上手 Commons Pool2

以下是使用 Commons Pool2 创建一个简单对象池的例子:

Step 1: 添加 Maven 依赖
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.11.1</version>
</dependency>
Step 2: 定义 PooledObjectFactory
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.PooledObjectFactory;
import org.apache.commons.pool2.impl.DefaultPooledObject;

public class MyObjectFactory implements PooledObjectFactory<MyObject> {

    @Override
    public PooledObject<MyObject> makeObject() {
        return new DefaultPooledObject<>(new MyObject());
    }

    @Override
    public void destroyObject(PooledObject<MyObject> p) {
        // 清理对象资源
        p.getObject().close();
    }

    @Override
    public boolean validateObject(PooledObject<MyObject> p) {
        // 验证对象是否可用
        return p.getObject().isValid();
    }

    @Override
    public void activateObject(PooledObject<MyObject> p) {
        // 激活对象(例如重置状态)
    }

    @Override
    public void passivateObject(PooledObject<MyObject> p) {
        // 钝化对象(例如清理临时数据)
    }
}
Step 3: 配置对象池并使用
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

public class Main {
    public static void main(String[] args) {
        GenericObjectPoolConfig<MyObject> config = new GenericObjectPoolConfig<>();
        config.setMaxTotal(10); // 最大对象数量
        config.setMinIdle(2);  // 最小空闲数量
        config.setMaxIdle(5);  // 最大空闲数量

        GenericObjectPool<MyObject> pool = new GenericObjectPool<>(new MyObjectFactory(), config);

        try {
            MyObject obj = pool.borrowObject(); // 从池中借用对象
            obj.doWork();
            pool.returnObject(obj); // 将对象归还池
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            pool.close();
        }
    }
}

4. 常用配置解析

Commons Pool2 提供了丰富的配置选项,以下是一些常用参数:

配置项含义默认值
maxTotal池中最大对象总数8
minIdle池中最小空闲对象数0
maxIdle池中最大空闲对象数8
testOnBorrow借用对象时是否验证有效性false
testOnReturn归还对象时是否验证有效性false
blockWhenExhausted池耗尽时是否阻塞true
maxWaitMillis最大阻塞等待时间(毫秒)-1
timeBetweenEvictionRunsMillis空闲对象驱逐线程的运行间隔(毫秒)-1

通过合理配置这些参数,我们可以优化对象池的性能,适配具体的业务场景。


5. 使用场景

  • 数据库连接池:如配合 JDBC 使用,管理数据库连接。

  • 线程池:用于复用线程,减少线程创建开销。

  • 其他资源管理:如文件句柄、网络连接、缓存对象等。


6. 注意事项

  1. 资源泄漏:确保借用的对象始终归还池,否则会导致资源泄漏。

  2. 并发性:Commons Pool2 是线程安全的,但使用时需注意业务逻辑的线程安全性。

  3. 对象有效性检查:合理配置 validateObject 和测试参数,避免使用无效对象。


总结

Apache Commons Pool2 是一个功能强大且高度可配置的 Java 对象池实现。通过掌握其基本组件和使用方法,可以轻松地管理资源,提高系统性能。

希望你喜欢这篇文章!请点关注和收藏吧。你的关注和收藏会是我努力更新的动力,祝关注和收藏的帅哥美女们今年都能暴富。如果有更多问题,欢迎随时提问

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

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

相关文章

5G学习笔记之Non-Public Network

目录 0. NPN系列 1. 概述 2. SNPN 2.1 SNPN概述 2.2 SNPN架构 2.3 SNPN部署 2.3.1 完全独立 2.3.2 共享PLMN基站 2.3.3 共享PLMN基站和PLMN频谱 3. PNI-NPN 3.1 PNI-NPN概述 3.2 PNI-NPN部署 3.2.1 UPF独立 3.2.2 完全共享 0. NPN系列 1. NPN概述 2. NPN R18 3. 【SNPN系列】S…

大语言模型(LLM)中大数据的压缩存储及其重要性

在大型语言模型&#xff08;LLM&#xff09;中&#xff0c;KV Cache&#xff08;键值缓存&#xff09;的压缩方法及其重要性。 为什么要压缩KV Cache&#xff1f; 计算效率&#xff1a;在生成文本的过程中&#xff0c;每个生成的token都需要与之前所有的token的键值&#xff…

canvas之进度条

canvas之进度条 效果&#xff1a; 封装的组件 <template><div class"circle" :style"{ width: props.radius px, height: props.radius px }"><div class"circle-bg" :style"{ width: props.radius - 5 px, height: pr…

Boost之log日志使用

不讲理论&#xff0c;直接上在程序中可用代码&#xff1a; 一、引入Boost模块 开发环境&#xff1a;Visual Studio 2017 Boost库版本&#xff1a;1.68.0 安装方式&#xff1a;Nuget 安装命令&#xff1a; #只安装下面几个即可 Install-package boost -version 1.68.0 Install…

18.springcloud_openfeign之扩展组件二

文章目录 一、前言二、子容器默认组件FeignClientsConfigurationDecoder的注入Contract约定 对注解的支持对类上注解的支持对方法上注解的支持对参数上注解的支持MatrixVariablePathVariableRequestParamRequestHeaderSpringQueryMapRequestPartCookieValue FormattingConversi…

7-8 N皇后问题

目录 题目描述 输入格式: 输出格式: 输入样例: 输出样例: 解题思路&#xff1a; 详细代码&#xff08;dfs&#xff09;&#xff1a; 简单代码&#xff08;打表&#xff09;&#xff1a; 题目描述 在NN格的国际象棋盘上摆放N个皇后&#xff0c;使其不能互相攻击&#xff0c;即任…

现代网络负载均衡与代理导论

大家觉得有有参考意义和帮助记得及时关注和点赞&#xff01;&#xff01;&#xff01; Service mesh 是近两年网络、容器编排和微服务领域最火热的话题之一。Envoy 是目前 service mesh 数据平面的首选组件。Matt Klein 是 Envoy 的设计者和核心开发。 文章循序渐进&#xff0…

Kubernetes Gateway API-2-跨命名空间路由

1 跨命名空间路由 Gateway API 具有跨命名空间路由的核心支持。当多个用户或团队共享底层网络基础设施时,这很有用,但必须对控制和配置进行分段,以尽量减少访问和容错域。 Gateway 和 Route(HTTPRoute,TCPRoute,GRPCRoute) 可以部署到不同的命名空间中,路由可以跨命名空间…

Wend看源码-Java-集合学习(List)

摘要 本篇文章深入探讨了基于JDK 21版本的Java.util包中提供的多样化集合类型。在Java中集合共分类为三种数据结构&#xff1a;List、Set和Queue。本文将详细阐述这些数据类型的各自实现&#xff0c;并按照线程安全性进行分类&#xff0c;分别介绍非线程安全与线程安全的实现方…

集成方案 | Docusign + 蓝凌 EKP,打造一站式合同管理平台,实现无缝协作!

本文将详细介绍 Docusign 与蓝凌 EKP 的集成步骤及其效果&#xff0c;并通过实际应用场景来展示 Docusign 的强大集成能力&#xff0c;以证明 Docusign 集成功能的高效性和实用性。 在当今数字化办公环境中&#xff0c;企业对于提高工作效率和提升用户体验的需求日益迫切。蓝凌…

突围边缘:OpenAI开源实时嵌入式API,AI触角延伸至微观世界

当OpenAI宣布开源其名为openai-realtime-embedded-sdk的实时嵌入式API时&#xff0c;整个科技界都为之震惊。这一举动意味着&#xff0c;曾经遥不可及的强大AI能力&#xff0c;如今可以被嵌入到像ESP32这样的微型控制器中&#xff0c;真正地将AI的触角延伸到了物联网和边缘计算…

webrtc-internals调试工具

Google 的 Chrome&#xff08;87 或更高版本&#xff09;WebRTC 内部工具是一套内置于 Chrome 浏览器中的调试工具; webrtc-internals 能够查看有关视频和音频轨道、使用的编解码器以及流的一般质量的详细信息。这些知识对于解决音频和视频质量差的问题非常有帮助。 webrtc-int…

使用Webpack构建微前端应用

英文社区对 Webpack Module Federation 的响应非常热烈&#xff0c;甚至被誉为“A game-changer in JavaScript architecture”&#xff0c;相对而言国内对此热度并不高&#xff0c;这一方面是因为 MF 强依赖于 Webpack5&#xff0c;升级成本有点高&#xff1b;另一方面是国内已…

[bug]java导出csv用Microsoft Office Excel打开乱码解决

[bug]java导出csv用Microsoft Office Excel打开乱码 ‍ 现象 首先这个csv文件用macbook自带的 "Numbers表格" 软件打开是不乱码的, 但是使用者是Windows系统,他的电脑没有"Numbers表格"工具, ​​ 他用Microsoft Office Excel打开之后出现乱码,如下图…

关于分布式数据库需要了解的相关知识!!!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于关于分布式数据库方面的相关内容&a…

tortoisegit推送失败

tortoisegit推送失败 git.exe push --progress -- "origin" testLidar:testLidar /usr/bin/bash: gitgithub.com: No such file or directory fatal: Could not read from remote repository. Please make sure you have the correct access rights and the reposit…

moviepy将图片序列制作成视频并加载字幕 - python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…

清空DNS 缓存

如果遇到修改了host文件&#xff0c;但是IP和域名的映射有问题的情况&#xff0c;可以尝试刷新DNS缓存。 ipconfig/flushdns win建加R建&#xff0c;然后输入cmd&#xff0c;然后回车 然后回车&#xff0c;或者点击确定按钮。 出现如下所示标识清空DNS 缓存成功。

2024最新鸿蒙开发面试题合集(二)-HarmonyOS NEXT Release(API 12 Release)

上一篇面试题链接&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/144685078 1. 鸿蒙简单介绍和发展历程 HarmonyOS 是新一代的智能终端操作系统&#xff0c;为不同设备的智能化、互联与协同提供了统一的语言。带来简洁&#xff0c;流畅&#xff0c;连续&#xff0…

Yocto 项目 - 共享状态缓存 (Shared State Cache) 机制

引言 在嵌入式开发中&#xff0c;构建效率直接影响项目的开发进度和质量。Yocto 项目通过其核心工具 BitBake 提供了灵活而强大的构建能力。然而&#xff0c;OpenEmbedded 构建系统的传统设计是从头开始构建所有内容&#xff08;Build from Scratch&#xff09;&#xff0c;这…