pool2使用介绍 GenericObjectPool
- 2018-06-25 17:04:00
- admin
- 原创 3463
一、GenericObjectPool使用介绍
1、pool2在线帮助:https://commons.apache.org/proper/commons-pool
2、ObjectPool对象池接口,GenericObjectPool是对象池实现;
3、PooledObject缓存对象接口,DefaultPooledObject是默认实现;
4、PooledObjectFactory缓存对象工厂接口,BasePooledObjectFactory是基础实现;
5、代码示例:Pool2App.java、pom.xml、pooldemo.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初始化空闲对象;