Apache Commons Pool 开源软件库提供了一个对象池API和一系列对象池实现。Apache Commons Pool 2.x与1.x相比实现了一个可重写的对象池实现。另外,性能和可伸缩性也有了改进,2.x版本包含鲁棒的实例追踪和对象池监控。2.x版本需要JDK6以上版本。
查看下载页面获取发行版本。
org.apache.commons.pool2包下定义了几个对象池接口和基类,在创建新的对象池实现时可 以参考。
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提供了一系列配置选项,比如可以容纳的活跃或者空闲的实例个数,空闲 对象的清除策略,等等。在版本2中,还提供对被遗弃对象的追踪和移除。
SoftReferenceObjectPool可以根据需要增长,但是可以允许虚拟机在需要时从对象池中清除 对象。
使用2.x系列版本的客户端代码在使用最新的2.x发行版本时不需要做任何改变。 新的2.x发行版可能会支持一些新的配置属性。这些将会在变更日志中列出。需要注意, Apache Commons Pool中的MBean接口(以MXBean或MBean结尾),比如 DefaultPooledObjectInfoMBean, GenericKeyedObjectPoolMXBean 或者 GenericKeyedObjectPoolMXBean为了支持新的属性,在不同版本之间发生改变。这些接口 不应该被客户端所实现,所以这些接口不需要考虑向后兼容性.
Apache Commons Pool从1.x迁移到2.x需要一些代码改动。最大改动应该是包 org.apache.commons.pool更名为org.apache.commons.pool2和PooledObjectFactory的一些 实现类发生了改变。
虽然一些属性的名称为了一致性已经发生了改变,但是Apache Commons Pool确保了同名的属性在不同版本的池中有相同的含义。一些关键的实现类(GenericObjectPool 和 GenericKeyedObjectPool)保留了原来的属性,所以我们在升级的过程中可以不用修改这些属性的名称。不过,我们还是推荐使用新的属性名称。转载自 并发编程网 - ifeve.com
相关资源:敏捷开发V1.0.pptx