在一些缓存,数据库的操作中总能看到commons-pool包的身影,从理论上,对一些实例化的成本的对象进行缓存,需要的时候从缓存池中拿出,可以降低应用的运行成本,提高效率,但是具体到实际中代码怎么实现,也是一知半解,简单阅读了apache官网的commons-pool的referrence,结合别人的理解,做一下笔记。
从对象的角度看,commons-pool提供了两个基本的接口,
PooledObject, 从名字上就可以知道,他是一个对象,是放在缓存池中的对象
ObjectPool,缓存池,用于存放PoolObject对象的池(有点拗口)
PooledObjectFactory,工厂类,用于生产缓存池
PoolObjectFactory的代码段
public interface PooledObjectFactory<T> {
PooledObject<T> makeObject(); //新增对象
void activateObject(PooledObject<T> obj);//用于从pool中借出去之前检测该对象是否处于钝化状态,
void passivateObject(PooledObject<T> obj);//当对象被归还到池中之前执行
boolean validateObject(PooledObject<T> obj);//在他从池中借出的之前检测对象是否可用
void destroyObject(PooledObject<T> obj);//销毁对象
}
PooledObjectFactory必须是线程安全的,ObjectPool承诺不会将同一个object实例传递给PooledObjectFactory的多个方法。
PoolObjectFactory创建和管理PoolObject,这些PoolObject用于作为包装类包装我们要缓存的对象,包装类维持了缓存对象的状态,包装类有DefaultPooledObject,或者实现PoolableObjectFactory接口,或者抽象类BasePooledObjectFactory抽象类,包装类提供了makeObject()方法返回wrap(create()),其中wrap()和create()方法都是抽象方法,需要使用者自己扩展。
BaseKeyedPooledObjectFactory是实现KeyedPooledObjectFactory接口。
GenericObjectPool实现了ObjectPool接口,提供了丰富的缓存池操作。