当前位置: 首页 > article >正文

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> {

    @Override
    public MyObject create() {
        return new MyObject(); // 创建对象
    }

    @Override
    public PooledObject<MyObject> wrap(MyObject obj) {
        return new DefaultPooledObject<>(obj); // 包装成池化对象
    }

    @Override
    public 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> {

    @Override
    public MyObject create(String key) {
        return new MyObject(); // 根据键创建对象
    }

    @Override
    public 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> {
    @Override
    public MyObject create() {
        return new MyObject();
    }

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

    @Override
    public void destroyObject(PooledObject<MyObject> p) {
        System.out.println("Destroying object: " + p.getObject());
    }

    @Override
    public boolean validateObject(PooledObject<MyObject> p) {
        // 验证对象有效性
        return true; // 根据需求实现具体逻辑
    }
}

典型应用场景

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

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

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

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


总结

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

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

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


http://www.kler.cn/a/506533.html

相关文章:

  • 图论的起点——七桥问题
  • Ubuntu 安装和配置 MariaDB
  • 【学习笔记】Macbook管理多个不同的Python版本
  • 软件测试 —— 自动化测试(Selenium)
  • TCP 连接状态标识 | SYN, FIN, ACK, PSH, RST, URG
  • Go-Zero整合Goose实现MySQL数据库版本管理
  • 2.两数相加--力扣
  • tomcat文件目录讲解
  • 剑指Offer|LCR 031. LRU 缓存
  • Haskell语言的网络编程
  • 基于 Electron 应用的安全测试基础 — 提取和分析 .asar 文件
  • 【k8s面试题2025】1、练气期
  • 鸿蒙-点击Notification通知并打开App的具体页面
  • 动态规划汇总1
  • 服务器数据恢复—Zfs文件系统数据恢复案例
  • mongDB学习笔记
  • 基于Linux系统指令使用详细解析
  • 浅谈云计算18 | OpenStack架构概述
  • 自动化仓储管理与库存控制
  • 《零基础Go语言算法实战》【题目 4-11】在不使用任何内置散列表库的情况下设计一个 HashSet
  • 蓝桥杯刷题第三天——排序
  • 如何有效防止和解决IP劫持问题
  • Linux中常用命令详解
  • STM32 FreeRTOS消息队列
  • 使用DAS的导出和导入功能迁移GaussDB数据
  • 【JAVA】-JDK