您的位置:

解析Apache Commons Pool

Apache Commons Pool是一个对象池实现,能够管理可以共享和重用实例的Java对象,从而降低内存消耗并提高资源利用率。在这篇文章中,我们将深入研究这个强大的工具。

一、commons-pool2

commons-pool2是Apache Commons Pool的最新版本,具有很多改进和新功能。可以使用以下代码块引入它:

import org.apache.commons.pool2.ObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPool;

ObjectPool<MyObject> pool = new GenericObjectPool<>(new MyObjectFactory());

这段代码创建了一个MyObject对象池,并使用MyObjectFactory创建对象。

要从池中取出对象和将对象归还池中,请使用以下代码:

MyObject obj = pool.borrowObject();
//使用obj进行操作
pool.returnObject(obj);

池对象的方便之处在于,它们可以在需要时自动创建和释放。这有利于提高应用程序的性能和可扩展性。

二、commons-pool2空闲时间

commons-pool2可以用来管理一批重量级的资源,如数据库连接。但是,这些资源有时需要一段时间才能启动或恢复。如果资源在太长时间内处于空闲状态,那么它们可能会被关闭或释放,导致应用程序出现错误。为了解决这个问题,commons-pool2引入了idleTime属性,它指定对象在池中保持空闲的最长时间。

以下代码使用3秒的idleTime属性创建了一个MyObject对象池:

GenericObjectPoolConfig<MyObject> config = new GenericObjectPoolConfig<>(); 
config.setMaxIdle(5);
config.setMaxTotal(10);
config.setMinIdle(3);
config.setMaxWaitMillis(5000);
config.setTestOnBorrow(true);
config.setMinEvictableIdleTimeMillis(3000);      // 设置连接空闲时间超时为3秒 

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

这段代码将池的最大总数设置为10,最小空闲数设置为3,最大空闲数设置为5,并为借用对象设置了测试和最大等待时间。还将最小可逐出空闲连接时间设置为3秒。

三、commons-pool2使用

commons-pool2提供了很多有用的配置选项,可以根据应用程序的所需进行优化。例如,可以设置池的最大等待时间或在池中创建时进行自定义初始化。以下是一些示例代码段:

1. 限制总连接数:

config.setMaxTotal(10);

2. 配置连接等待时间:

config.setMaxWaitMillis(5000);

3. 自定义对象创建:

public class MyObjectFactory extends BasePooledObjectFactory<MyObject> {
    public MyObject create() throws Exception {
        MyObject obj = new MyObject();
        //自定义初始化
        return obj;
    }

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

这个示例中实现了create方法,用于自定义MyObject对象的初始化,从而提高资源利用效率。

四、commons-pool2 key选取

在某些情况下,池的每个对象都需要不同的键。例如,池可能需要管理连接池,每个连接都需要不同的密码。为了达到这个目的,可以使用KeyedPooledObjectFactory,该工厂使用外部键键入单独的子池。

以下是一些使用key选取子池的示例代码:
class MyKeyedPooledObjectFactory extends BaseKeyedPooledObjectFactory<String, Connection> {
    public Connection create(String key) throws Exception {
        Connection conn = createConnection(key);
        return conn;
    } 

    public PooledObject<Connection> makeObject(String key) throws Exception {
        return wrap(create(key));
    }
 
    public void destroyObject(String key, PooledObject<Connection> object) throws Exception {
        object.getObject().close();
    }

    public PooledObject<Connection> wrap(Connection conn) {
        return new DefaultPooledObject<>(conn);
    }
}

KeyedObjectPool<String, Connection> pool = new GenericKeyedObjectPool<>(new MyKeyedPooledObjectFactory());

这个示例使用了一个MyKeyedPooledObjectFactory工厂,它针对不同的“键”创建自定义的连接对象。创建出来的对象将使用预先定义的键作为索引,以便使用方便的方式从它们中获取。可以将多个连接作为子池存储在对象池中,从而保证控制并发。

总结

Apache Commons Pool是一个强大的Java库,可以有效地管理对象的生存周期,从而提高资源的使用效率。commons-pool2具有灵活的配置选项和扩展性,可以处理各种应用程序的需求。通过仔细分析和实践,可以为其优化提供更好的性能和可靠性。