pool2使用介绍 GenericObjectPool

2018-06-25 17:04:00
admin
原创 3463
摘要:pool2使用介绍 GenericObjectPool

一、GenericObjectPool使用介绍

1、pool2在线帮助:https://commons.apache.org/proper/commons-pool

2、ObjectPool对象池接口,GenericObjectPool是对象池实现;

3、PooledObject缓存对象接口,DefaultPooledObject是默认实现

4、PooledObjectFactory缓存对象工厂接口,BasePooledObjectFactory是基础实现;

5、代码示例:Pool2App.javapom.xmlpooldemo.zip


GenericObjectPoolConfig常用配置:

1、fairness多线程获取对象公平性,默认false;

2、maxTotal对象池最大对象数量,-1表示不限制数量,默认8个;

3、maxIdle对象池最大空闲对象数量,-1表示不限制数量,默认8个;

4、minIdle对象池最小空闲对象数量,最小0个,默认0个;

5、maxWaitDuration获取对象最长等待时间,-1表示一直等待,默认-1毫秒;

6、blockWhenExhausted对象池用完时是否阻塞,阻塞最长等待时间,默认true;


GenericObjectPoolConfig不常用配置:

1、lifo空闲对象是否后进先出,默认true;

2、testOnCreate创建对象时是否调用validateObject,默认false;

3、testOnBorrow获取对象时是否调用validateObject,默认false;

4、testOnReturn归还对象时是否调用validateObject,默认false;

5、jmxEnabled是否开启JMX监控,默认true;


PooledObjectFactory函数介绍:

1、PooledObject<T> makeObject(),生成缓存对象;

2、void activateObject(PooledObject<T> p),激活缓存对象;

3、boolean validateObject(PooledObject<T> p),验证缓存对象;

4、void passivateObject(PooledObject<T> p),钝化缓存对象;

5、void destroyObject(PooledObject<T> p),销毁缓存对象;


GenericObjectPool函数介绍:

1、T borrowObject(),从对象池获取对象;

2、void returnObject(T obj),归还对象到对象池;

3、void invalidateObject(T obj),从对象池清除对象;

4、void addObject(),增加一个新对象到对象池;

5、void preparePool(),初始化空闲对象,使数量达到minIdle

6、void clear(),清除所有的空闲对象,释放闲置资源

7、void close(),关闭对象池,清除所有的空闲对象;

8、int getNumActive(),正在使用的对象数量;

9、int getNumIdle(),空闲对象数量;


GenericObjectPool统计函数:

1、long getCreatedCount(),创建对象次数;

2、long getDestroyedCount(),销毁对象次数;

3、long getBorrowedCount(),成功获取对象次数;

4、long getReturnedCount(),成功归还对象次数;

5、long getDestroyedByEvictorCount(),淘汰对象数量;

6、Duration getMeanIdleDuration(),最近对象平均空闲时间;

7、Duration getMeanBorrowWaitDuration(),最近对象平均获取时间;

8、Duration getMaxBorrowWaitDuration(),过去最长对象获取时间;

9、Duration getMeanActiveDuration(),最近对象平均使用时间;


二、GenericObjectPool使用详解

获取对象:

1、空闲队列非空,直接从空闲队列获取对象;

2、对象数量没有达到上限,直接创建一个对象;

3、如果仍然无法获取对象,blockWhenExhausted=true等待空闲队列;

4、如果仍然无法获取对象,blockWhenExhausted=false直接抛出异常;

5、获取对象后调用activateObject激活对象,激活失败会导致销毁对象;

6、新建对象激活失败会抛出异常,历史对象激活失败会重复获取对象流程;

7、获取对象后调用validateObject验证对象,验证失败会导致销毁对象;

8、新建对象验证失败会抛出异常,历史对象验证失败会重复获取对象流程;


归还对象:

1、检查对象是否ALLOCATED,如果不是抛出异常,如果是扭转到RETURNING;

2、testOnReturn=true,validateObject验证对象,验证失败会结束归还对象流程;

3、调用passivateObject钝化对象,钝化失败会结束归还对象流程;

4、调用PooledObject.deallocate,对象状态扭转到IDLE;

5、添加对象到空闲对象列表idleObjects,lifo配置决定放入队列头尾;


增加对象:

1、对象池已满则直接返回,对象池未满则创建新对象;

2、调用passivateObject钝化对象,然后放入空闲队列;

3、addObject会调用passivateObject钝化对象;

4、preparePool不会调用passivateObject钝化对象;


清除对象:

1、对象属于对象池,状态不是INVALID,才能清除对象;

2、首先扭转到INVALID,然后调用destroyObject;


淘汰对象设置:

1、durationBetweenEvictionRuns淘汰对象检测周期,-1表示不淘汰对象,默认-1毫秒;

2、numTestsPerEvictionRun每次检测对象数量上限,负数表示空闲对象比例,默认3个;

3、minEvictableIdleDuration空闲对象淘汰时间,-1表示永不过期,默认30分钟;

4、softMinEvictableIdleDuration软空闲对象淘汰时间,-1表示永不过期,默认-1毫秒;

5、evictorShutdownTimeoutDuration淘汰对象定时器关闭最长等待时间,默认10秒;

6、void setDurationBetweenEvictionRuns(duration),正数开启定时器,负数关闭定时器;


淘汰对象详解:

1、默认淘汰策略1:空闲时间超过淘汰时间,这些对象需要无条件进行淘汰;

2、默认淘汰策略2:空闲对象数量大于minIdle,空闲时间超过软淘汰时间,进行淘汰;

3、空闲对象不满足淘汰策略,testWhileIdle=true,进行空闲对象测试,默认false;

4、空闲对象测试流程:activateObject、validateObject、passivateObject;

5、淘汰对象使用定时器执行任务,执行任务频率为上面的淘汰对象检测周期;

6、任务先调用evict执行以上淘汰流程,然后调用ensureMinIdle初始化空闲对象;

发表评论
评论通过审核之后才会显示。