一、背景介绍
创建新的对象并初始化的操作,可能会消耗很多的时间。在需要频繁创建并使用这些对象的场景中,为了提供系统性能,通常的做法是,创建一个对象池,将一定数量的对象缓存到这个对象池中。需要使用时直接从对象池中取出对象,使用完后将对象扔回到对象池中即可。Apache的commons pool组件是我们实现对象池化技术的良好助手。
二、组件基本介绍
该项目是一个基本的对象池组件,Pool提供三个主要方面对象池的API:
a) 一个提供客户方和实现方用来实现简单、可变的对象池的基本接口。
b) 一个用来创建模块化对象池的工具。
c) 几个通用的对象池的实现。
三、组件特点
org.apache.commons.pool包定义了一部分在创建一个新的对象池实现时十分有用的接口和基本类。
四、对象池
(1)ObjectPool ObjectPool定义了一个简单小巧的池化接口,主要有GenericObjectPool、StackObjectPool、SoftReferenceObjectPool三个实现类;
a)GenericObjectPool:可配置LIFO/FIFO行为的ObjectPool的实现。默认采用LIFO队列方式。这意味着当有闲置的可用对象在对象池中时,borrowObject方法会返回最近的实例。如果配置文件中的lifo配置项的值为false,则将返回相反排序的实例,也就是会返回最先进入对象池的对象的实例。
b)StackObjectPool:使用LIFO行为实现的ObjectPool。
c)SoftReferenceObjectPool:使用LIFO行为实现的ObjectPool。此外,在这个对象池实现中,每个对象都会被包装到一个SoftReference中。SoftReference允许垃圾回收机制在需要释放内存时回收对象池中的对象。
(2)KeyedObjectPool KeyedObjectPool对象池有多种类型情况的对象池的实现,每种类型对应一个任意的键值,组件给出了GenericKeyedObjectPool、StackKeyedObjectPool两个基本的实现类;
a)GenericKeyedObjectPool:通过FIFO行为实现的对象池。
b)StackKeyedObjectPool:通过LIFO行为实现的对象池。
五、PoolableObjectFactory、ObjectPool及ObjectPoolFactory
在commons pool组件中,对象池化的工作被划分给了三类对象: PoolableObjectFactoryExample.java
(1) PoolableObjectFactory用于管理池化对象的产生、激活、挂起、校验和销毁;
(2) ObjectPool用于管理要被池化的对象的借出和归还,同时通知PoolableObjectFactory完成相应的工作;
(3) ObjectPoolFactory则用于大量生成相同类型和设置的ObjectPool;
相应的,使用Pool组件的过程,也可大体划分成“实现自己的PoolableObjectFactory”、“使用ObjectPool”和可选的“利用ObjectPoolFactory”三个步骤。
(1) 实现自己的PoolableObjectFactory
ObjectPool的实例在需要处理池化的对象的产生、激活、挂起、校验和销毁工作时,就会调用跟它关联在一起的PoolableObjectFactory实例的相应方法来操作。PoolableObjectFactory是commons-pool中定义个一个接口,Pool组件中没有包含任何一种PoolableObjectFactory实现,需要根据情况自行创立。