【荒于嬉】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实现
returnObject
GenericObjectPool 实现
版权声明: 本文为 InfoQ 作者【luojiahu】的原创文章。
原文链接:【http://xie.infoq.cn/article/53577329b0935cfcd0a085038】。文章转载请联系作者。
评论