程序中许多资源的使用是有限制的,比如数据库连接,线程等。如果要对这些资源的创建和分配进行有效管理,则需要建立资源池也即对象池。
资源池的功能是提供对象和回收对象。和普通对象工厂不同的是,它还有以下职责:确保创建的资源数不能大于最大值(如果有最大值的话);确保空闲资源不能过多;在没有空闲资源的时候,做应该做的事,比如报错或者让线程等待。
虽然它的实现并不复杂,但是作为java开发人员,我们也不需要自己实现了。因为apache的commons-pool-<版本号>.jar包里面的类已经帮我们实现了此功能。我们只要实现资源的工厂类就可以了。
类介绍:
·StackObjectPool:不控制资源个数的资源池。
·GenericObjectPool:是一个比较常用的资源池,它会控制资源总数量,和空闲资源数量。
·SoftReferenceObjectPool:允许java垃圾回收器回收资源对象的资源池。
使用举例:
例如,有一种资源(MyObject)需要被对象池管理起来。那么我们只要创建一个工厂类MyObjectFactory就可以了。
代码如下:
- import org.apache.commons.pool.BasePoolableObjectFactory;
- public class MyObjectFactory extends BasePoolableObjectFactory {
- int count=0;
- @Override
- public Object makeObject() throws Exception {
- // TODO Auto-generated method stub
- MyObject o=new MyObject();
- o.name=(count++)+"";
- return o;
- }
- }
得到资源池的代码如下:
ObjectPool pool=new GenericObjectPool(new MyObjectFactory(),20);
上面得到的资源池,最多可以提供20个资源对象。
之后程序中就可以用“MyObject mo=(MyObject)pool.borrowObject()” 来代替“new MyObject()”了。
同时apache的pool组件定义了标准的接口,很方便我们扩展。比如,需要这样一个对象池,它管理3种对象。比如“苹果对象”、“梨对象”、“桔子”,要求根据不同的参数得到不同的对象,但是3种对象的数量之和不超过50。jar包中没有现成的对象池类,但是只要我们实现了poo的标准接口,依然可以像GenericObjectPool一样方便的使用。