1.说明
介绍在对象池的配置,会有5个类代表config配置
GenericObjectPoolConfig和GenericObjectPoolConfig东西很少,就把剩下三个主要的讲一下
2.BaseObjectPoolConfig
属性如下
字段 | 意义 | 默认值 | 备注 |
---|---|---|---|
testOnCreate | 从pooledObjectFactory创建对象添加到objectPool时,是否进行有效性验证 | false | |
testOnReturn | pooledObject用完了"还"给objectPool时,是否进行有效性验证 | false | |
blockWhenExhausted | objectPool"借"出pooledObject时,当active数量为max时,是否阻塞等待一段时间 | true | (GenericKeyedObjectPool#borrowObject(K, long)) |
softMinEvictableIdleTimeMillis | 见下面EvictionConfig#idleSoftEvictTime说明 | -1 | 用于生成EvictionConfig,参照DefaultEvictionPolicy#evict |
numTestsPerEvictionRun | 返回每次evictor需要驱逐验证的个数 | 3 | 可能为负数,GenericObjectPool#getNumTests |
testWhileIdle | 返回evictor是否需要对处于idle状态下的pooledObject进行validate操作 | false | GenericObjectPool#evict |
testOnBorrow | objectPool"借"出pooledObject时,是否进行有效性验证 | false | |
minEvictableIdleTimeMillis | 见下面EvictionConfig#idleEvictTime说明 | 30min | 用于生成EvictionConfig,参照DefaultEvictionPolicy#evict |
maxWaitMillis | objectPool"借"出pooledObject时,当active数量为max时,等待的时长 | -1L(代表一直等) | 配合blockWhenExhausted使用 |
lifo | objectPool中的idle列表是双端队列,设定是否last in first out | true | |
timeBetweenEvictionRunsMillis | evictor的启动间隔时间 | -1L | >0才运行,BaseGenericObjectPool#startEvictor |
3.EvictionConfig
这个类是用来对EvictionPolicy进行配置的
备注,这几个值并没有明确的意义,因为是配合EvictionPolicy进行evict用的
下面结合DefaultEvictionPolicy来讲解字段意义
字段 | 意义 | 默认值 | 备注 |
---|---|---|---|
idleEvictTime | pooledObject保持了idle状态的时长超过了该值,会被evict | Long.MAX_VALUE | 硬标准 |
idleSoftEvictTime | 软标准情况下,pooledObject保持了idle状态的时长,判断是否evict | Long.MAX_VALUE | 软标准,自己设值一般比idleEvictTime小,结合minIdle使用 |
minIdle | 软标准情况下,至少留下几个object继续保持idle(节省开销) | 0 | 软标准,结合idleSoftEvictTime使用 |
这个软硬标准是自己理解的,官网并没有讲,具体参考DefaultEvictionPolicy实现
@Override
public boolean evict(EvictionConfig config, PooledObject<T> underTest,
int idleCount) {
if ((config.getIdleSoftEvictTime() < underTest.getIdleTimeMillis() && config.getMinIdle() < idleCount)
//上面一行是软标准,下面这一行是硬标准
|| config.getIdleEvictTime() < underTest.getIdleTimeMillis()) {
return true;
}
return false;
}
4.AbandonedConfig
字段 | 意义 | 默认值 | 备注 |
---|---|---|---|
logAbandoned | 标记是否在pooledObject被abandon的时候打出堆栈 | false | 参考GenericObjectPool#removeAbandoned |
removeAbandonedOnBorrow | 标记从objectPool里"借"出时,是否将一些认为无用的pooledObject给remove掉 | false | |
removeAbandonedTimeout | 当pooledObject处于allocated状态下,但是超过该时长没有用过,则abandon | 300(调用方会转成300s) | 在removeAbandonedOnBorrow=true的前提下 |
removeAbandonedOnMaintenance | evictor工作时,是否进行abandon | false |
5.思考
1.EvictionConfig软硬标准
这个是自己理解的
2.AbandonedConifg和EvictConfig的区别是什么
AbandonedConifg针对的是allocate状态下(或者说active状态下),进行"丢弃"
EvictConfig针对的是idle状态下,进行"驱逐'
其实名字差不多,就是针对的状态不一样
可以从pool的清理策略上面来理解
3.为什么AbandonedConifg只有GenericObjectPool可以用,但是GenericKeyedObjectPool不用
GenericKeyedObjectPool没有细看,但是GenericKeyedObjectPool并没有allocated这个状态,不适合于AbandonedConifg
6.问题以及吐槽
1.AbandonedConfig#logAbandoned为什么要和pooledObject强耦合,一个wrapper还要知道自己打不打log???
个人感觉该记的堆栈记住,需要打log的时候,在objectPool里面根据config来判断就好了
2.EvictConfig里面的字段为什么要和BaseObjectPoolConfig字段重复???
BaseObjectPoolConfig基本上都包含了EvictConfig,但是不包含AbandonedConfig
这样就出现了奇怪的写法
GenericObjectPool的构造函数
public GenericObjectPool(PooledObjectFactory<T> factory,
GenericObjectPoolConfig config, AbandonedConfig abandonedConfig) {
this(factory, config);
setAbandonedConfig(abandonedConfig);
}
既然这样还要EvictConfig干嘛
3.另外文档莫名其妙的点有点多
比如这里
If set to true, abandoned objects are removed by borrowObject if
there are fewer than 2 idle objects available in the pool and getNumActive() > getMaxTotal() - 3
WTF,why.