Apache Commons Pool 开源软件库提供了一个对象池API和一系列对象池实现。Apache Commons Pool 2.x与1.x相比实现了一个可重写的对象池实现。另外,性能和可伸缩性也有了改进,2.x版本包含鲁棒的实例追踪和对象池监控。2.x版本需要JDK6以上版本。
发布
查看下载页面获取发行版本。
特性
org.apache.commons.pool2包下定义了几个对象池接口和基类,在创建新的对象池实现时可
以参考。
PooledObjectFactory
PooledObjectFactory提供了一个管理对象池对象生命周期的通用接口。
public interface PooledObjectFactory<T> {
PooledObject<T> makeObject();
void activateObject(PooledObject<T> obj);
void passivateObject(PooledObject<T> obj);
boolean validateObject(PooledObject<T> obj);
void destroyObject(PooledObject<T> obj);
}
使用1.x版本的用户应该会注意到,在1.x中直接通过创建PoolableObjectFactorys来管理对象
池内的对象,版本2中通过PooledObjectFactorys来管理对象池内的对象(PooledObject)。
这些包装器对象维护对象池的状态,可以通过PooledObjectFactory内的方法来访问比如对象
池内某个对象的创建时间或最后使用时间。DefaultPooledObject类可以用来追踪对象池内对
象的状态。实现一个PoolableObjectFactory的最简单方式就是通过继承
BasePooledObjectFactory。BasePooledObjectFactory提供了一个makeObject()方法,这个
方法内部实现为wrap(create()),其中wrap和create都是抽象方法。你可以通过实现create方
法来创建你想通过对象来管理的底层对象,然后通过wrap方法来包装在PooledObject中创建
的实例。使用DefaultPooledObject包装器,可以如下
@Override
public PooledObject<Foo> wrap(Foo foo) {
return new DefaultPooledObject<Foo>(foo);
}
这里的Foo是一个被“池化”的类型(create()方法返回的类型)。KeyedPooledObjectFactory
也为KeyedObjectPool定义了一个类似的接口:
public interface KeyedPoolableObjectFactory<K,V> {
PooledObject<V> makeObject(K key);
void activateObject(K key, PooledObject<V> obj);
void passivateObject(K key, PooledObject<V> obj);
boolean validateObject(K key, PooledObject<V> obj);
void destroyObject(K key, PooledObject<V> obj);
}
BaseKeyedPooledObjectFactory提供了KeyedPooledObjectFactory的一个抽象实现。
org.apache.commons.pool2.impl 包下提供了对象池实现。
GenericObjectPool
GenericObjectPool提供了一系列配置选项,比如可以容纳的活跃或者空闲的实例个数,空闲
对象的清除策略,等等。在版本2中,还提供对被遗弃对象的追踪和移除。
SoftReferenceObjectPool
SoftReferenceObjectPool可以根据需要增长,但是可以允许虚拟机在需要时从对象池中清除
对象。
对象池从2.x迁移到2.y
使用2.x系列版本的客户端代码在使用最新的2.x发行版本时不需要做任何改变。
新的2.x发行版可能会支持一些新的配置属性。这些将会在变更日志中列出。需要注意,
Apache Commons Pool中的MBean接口(以MXBean或MBean结尾),比如
DefaultPooledObjectInfoMBean, GenericKeyedObjectPoolMXBean 或者
GenericKeyedObjectPoolMXBean为了支持新的属性,在不同版本之间发生改变。这些接口
不应该被客户端所实现,所以这些接口不需要考虑向后兼容性.
对象池从1.x迁移到2.x
Apache Commons Pool从1.x迁移到2.x需要一些代码改动。最大改动应该是包
org.apache.commons.pool更名为org.apache.commons.pool2和PooledObjectFactory的一些
实现类发生了改变。
虽然一些属性的名称为了一致性已经发生了改变,但是Apache Commons Pool确保了同名的属性在不同版本的池中有相同的含义。一些关键的实现类(GenericObjectPool 和 GenericKeyedObjectPool)保留了原来的属性,所以我们在升级的过程中可以不用修改这些属性的名称。不过,我们还是推荐使用新的属性名称。转载自 并发编程网 - ifeve.com