commons-pool2 2 - poolObject API与状态机

说明

上一节还没讲poolObject的状态以及状态机,api也没有进行介绍,这里补充

状态

PooledObjectState

对应状态如下

状态 说明
IDLE 位于队列中,未使用
ALLOCATED 在使用
EVICTION 位于队列中,当前正在测试,可能会被回收
EVICTION_RETURN_TO_HEAD 不在队列中,当前正在测试,可能会被回收。从池中借出对象时需要从队列出移除并进行测试
VALIDATION 位于队列中,当前正在验证
VALIDATION_PREALLOCATION 不在队列中,当前正在验证。当对象从池中被借出,在配置了testOnBorrow的情况下,对像从队列移除和进行预分配的时候会进行验证
VALIDATION_RETURN_TO_HEAD 不在队列中,正在进行验证。从池中借出对象时,从队列移除对象时会先进行测试。返回到队列头部的时候应该做一次完整的验证
INVALID 回收或验证失败,将销毁
ABANDONED 即将无效
RETURN 返还到池中

里面所谓的在队列,应该是对象池所拥有的idle队列
如org.apache.commons.pool2.impl.GenericObjectPool#idleObjects

API列表

commons-pool2 2 - poolObject API与状态机_第1张图片
Paste_Image.png

几个涉及状态变化的函数如下

//对象状态变成EVICTION    
boolean startEvictionTest();

//通知“驱除”结束
boolean endEvictionTest(Deque> idleQueue);

//分配资源给object
boolean allocate();

//回收资源,如果是Allocated状态则转成Idle状态
boolean deallocate();

//标记为丢弃
void markAbandoned();

//标记为"还"给pool
void markReturning()

默认实现类

上面讲了一堆,还是看默认实现类DefaultPooledObject源码方便一点

commons-pool2 2 - poolObject API与状态机_第2张图片
Paste_Image.png
commons-pool2 2 - poolObject API与状态机_第3张图片
Paste_Image.png
commons-pool2 2 - poolObject API与状态机_第4张图片
Paste_Image.png

可以看出基本就是对一些跟踪信息进行处理(createTime等),以及状态的验证以及改变

状态机转换

盗图如下


commons-pool2 2 - poolObject API与状态机_第5张图片
Paste_Image.png

思考

1.感觉这个javadoc写的不清晰,而且到最新的2.4.2 还是没有啥变化

2.这里大致明确pooledObject的状态以及状态机就行,暂时还看不出来这些状态具体有什么用,后面会结合objectPool代码进行说明

3.GenericObjectPool函数主要分为三类

1.Object相关
2.信息获取相关
3,状态变化相关

4.DefaultPooledObject可以参考,提供了了state转换,以及分配,回收等默认实现
如果需要自己写,确保是在DefaultPooledObject基础上再干其他的事情

5.validateObject一般都是怎么实现的.根据服务方自定义。
比如在org.apache.commons.dbcp.PoolingConnection#validateObject(dbcp里面)中

Paste_Image.png

在jedis里面是

commons-pool2 2 - poolObject API与状态机_第6张图片
Paste_Image.png

问题

refer

http://aofengblog.blog.163.com/blog/static/6317021201463075826473/

你可能感兴趣的:(commons-pool2 2 - poolObject API与状态机)