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

打印 上一主题 下一主题

主题 859|帖子 859|积分 2577

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

Maven 依靠

在项目中添加 commons-pool2 的依靠:
  1. <dependency>
  2.     <groupId>org.apache.commons</groupId>
  3.     <artifactId>commons-pool2</artifactId>
  4.     <version>2.11.1</version> <!-- 使用最新版本 -->
  5. </dependency>
复制代码

核心概念


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

使用步调

1. 界说对象的工厂类

创建一个工厂类,继承 BasePooledObjectFactory 或实现 PooledObjectFactory 接口,用于管理对象的创建、烧毁、激活等生命周期。
  1. import org.apache.commons.pool2.PooledObject;
  2. import org.apache.commons.pool2.BasePooledObjectFactory;
  3. import org.apache.commons.pool2.impl.DefaultPooledObject;
  4. // 定义池化对象的工厂
  5. public class MyObjectFactory extends BasePooledObjectFactory<MyObject> {
  6.     @Override
  7.     public MyObject create() {
  8.         return new MyObject(); // 创建对象
  9.     }
  10.     @Override
  11.     public PooledObject<MyObject> wrap(MyObject obj) {
  12.         return new DefaultPooledObject<>(obj); // 包装成池化对象
  13.     }
  14.     @Override
  15.     public void destroyObject(PooledObject<MyObject> p) {
  16.         System.out.println("Destroying object: " + p.getObject());
  17.     }
  18. }
  19. // 自定义对象
  20. class MyObject {
  21.     public void doSomething() {
  22.         System.out.println("Working...");
  23.     }
  24. }
复制代码

2. 创建对象池

使用 GenericObjectPool 进行对象池管理。
  1. import org.apache.commons.pool2.impl.GenericObjectPool;
  2. public class ObjectPoolExample {
  3.     public static void main(String[] args) throws Exception {
  4.         // 创建对象池
  5.         GenericObjectPool<MyObject> pool = new GenericObjectPool<>(new MyObjectFactory());
  6.         // 配置对象池
  7.         pool.setMaxTotal(5); // 最大对象数
  8.         pool.setMinIdle(2); // 最小空闲对象数
  9.         // 借用对象
  10.         MyObject obj = pool.borrowObject();
  11.         obj.doSomething();
  12.         // 归还对象
  13.         pool.returnObject(obj);
  14.         // 关闭池
  15.         pool.close();
  16.     }
  17. }
复制代码

对象池设置参数

对象池(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。
  1. import org.apache.commons.pool2.PooledObject;
  2. import org.apache.commons.pool2.impl.DefaultPooledObject;
  3. import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
  4. import org.apache.commons.pool2.BaseKeyedPooledObjectFactory;
  5. // 定义带键的对象工厂
  6. class KeyedObjectFactory extends BaseKeyedPooledObjectFactory<String, MyObject> {
  7.     @Override
  8.     public MyObject create(String key) {
  9.         return new MyObject(); // 根据键创建对象
  10.     }
  11.     @Override
  12.     public PooledObject<MyObject> wrap(MyObject obj) {
  13.         return new DefaultPooledObject<>(obj);
  14.     }
  15. }
  16. public class KeyedObjectPoolExample {
  17.     public static void main(String[] args) throws Exception {
  18.         // 创建带键的对象池
  19.         GenericKeyedObjectPool<String, MyObject> pool = new GenericKeyedObjectPool<>(new KeyedObjectFactory());
  20.         // 借用对象
  21.         MyObject obj1 = pool.borrowObject("key1");
  22.         MyObject obj2 = pool.borrowObject("key2");
  23.         obj1.doSomething();
  24.         obj2.doSomething();
  25.         // 归还对象
  26.         pool.returnObject("key1", obj1);
  27.         pool.returnObject("key2", obj2);
  28.         // 关闭池
  29.         pool.close();
  30.     }
  31. }
复制代码

2. 对象池的烧毁和验证

通过自界说工厂方法,实现烧毁和验证逻辑:
  1. import org.apache.commons.pool2.PooledObject;
  2. import org.apache.commons.pool2.impl.DefaultPooledObject;
  3. class CustomObjectFactory extends BasePooledObjectFactory<MyObject> {
  4.     @Override
  5.     public MyObject create() {
  6.         return new MyObject();
  7.     }
  8.     @Override
  9.     public PooledObject<MyObject> wrap(MyObject obj) {
  10.         return new DefaultPooledObject<>(obj);
  11.     }
  12.     @Override
  13.     public void destroyObject(PooledObject<MyObject> p) {
  14.         System.out.println("Destroying object: " + p.getObject());
  15.     }
  16.     @Override
  17.     public boolean validateObject(PooledObject<MyObject> p) {
  18.         // 验证对象有效性
  19.         return true; // 根据需求实现具体逻辑
  20.     }
  21. }
复制代码

典型应用场景


  • 数据库连接池
    使用 commons-dbcp2 或类似框架,可以结合 commons-pool2 管理数据库连接。
  • 网络连接池
    通过对象池管理网络连接资源,制止频繁创建和烧毁连接。
  • 线程池管理
    配合自界说线程对象,实现线程池的资源复用。
  • 复杂对象的池化
    管理必要频繁创建、烧毁但初始化成本高的对象(如大内存对象)。

总结

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


  • 管理必要复用的昂贵对象。
  • 提高资源使用效率,降低体系资源开销。
  • 提供机动的设置和自界说生命周期管理。
它与其他 Apache 工具库(如 DBCP 数据库连接池)无缝集成,也可以单独用于其他资源池管理需求。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表