写点什么

【荒于嬉】common pool2 源码阅读纪要

用户头像
luojiahu
关注
发布于: 2020 年 10 月 03 日
【荒于嬉】common pool2 源码阅读纪要

Eviction



common pool2 通过后台定时任务维护池中对象,使其满足用户配置的空闲对象个数要求。



定时任务在对象池初始化时启动,其入参为timeBetweenEvictionRunsMillis,默认值为-1,表示不启动后台定时任务对池的大小进行维护。当该值被配置为大于0的数时,后台定时任务将会在对象池初始化的过程中被启动,按照用户配置的时间间隔定期维护。



与Eviction相关的参数如下:



minEvictableIdleTimeMillis

池中空闲对象可以被回收器回收的最小时间,默认值30min



softMinEvictableIdleTimeMillis

在保证最小空闲数的前提下,池中空闲对象可以被回收器回收的最小时间,默认值-1L



numTestsPerEvictionRun

回收器每次检查的对象次数,默认值3



evictorShutdownTimeoutMillis

关闭回收器的等待超时时间, 默认值10s



evictionPolicy

所使用的淘汰策略类型,实现EvictionPolicy接口;2.6.0之后引入,默认值null



evictionPolicyClassName

所使用的淘汰策略类名,2.6.0之前特性;默认值DefaultEvictionPolicy.class.getName()

removeAbandoned



将符合如下情况的对象进行回收:从连接池中取出,上次使用的时间getLastUsedTime()当前已经超过了removeAbandonedTimeout时间,当前未被归还。



removeAbandon相关配置在GenericObjectPool实现中,需要通过AbandonedConfig专门配置,普通实现中无相关配置。



回收的策略是直接销毁对象。销毁对象之后,会通过ensureIdle()调用保证连接池中至少有一个可用的空闲连接,或者当前连接总数达到maxTotal



需要注意的是,getLastUsedTime()方法的返回有两种情况。假如,连接池中的对象类实现了TrackedUse接口并且实现了getLastUsed()方法,那么以实际实现为准;否则,该方法返回的值与getLastBorrowed返回的值相同。所以,在使用pool2连接池时,如果配置了removedAbandoned选项,应用使用连接的时间不能超过removeAbandonedTimeout时间。

borrowObject

GenericObjectPool实现

BEGIN

IF removeAbandon configured
IF removeAbandonOnBorrow and idleNum<2 and activeNum>maxNum-3
do removeAbandon
END IF
END IF

WHILE p equals null
DO
LET create=false
poll first elements from idleObjects, let p=result.
IF p still null
try create p
IF p not null
let create=true
END IF
END IF
IF blockWhenExhausted and p still null
bocking poll first element of idleObject
if maxWaitTime less than 0, block until there is at least one idle object.
IF p still null, throw NoSuchElementException.
END IF
if p still null, throw NoSuchElementException.
try allocate p, if result is false, let p=null.
IF p not null
try activate p
IF exeption happens, destroy p and throw exception.
IF testOnBorrow or testOnCreate
try validate p, if exception happens, record it.
if validation fails, destroy it and throw exception when it is created.
END IF
END IF
END WHILE

update pool borrow related statistic stats.

END

returnObject

GenericObjectPool 实现

BEGIN
get PooledObject p from allObjects with to be returned.
IF p is null
IF abandon configured, return
ELSE throw exception.
END IF
mark the status of p to RETURNING.
IF testOnReturn and validate p failed.
try destroy p.
ensure that there is at least one idle object in the pool.
update pool's return related statistic status.
END IF
try passivate p.
deallocate p and update its status to IDLE.
IF pool closed or current idle counts is more than maxIdle
try destroy p.
ELSE
add p to idleObjects queue.
IF pool closed, clear the pool.
END IF
update pool's return related statistic status.
END



发布于: 2020 年 10 月 03 日阅读数: 38
用户头像

luojiahu

关注

喜欢思考组织、过程、产品的后端开发 2017.01.08 加入

还未添加个人简介

评论

发布
暂无评论
【荒于嬉】common pool2 源码阅读纪要