apache-common-pool2使用以及(配置参数详解,以及资源回收,从池中获取资源,将资源返还给池)
2016-12-07 00:00
756 查看
使用方式参考:http://www.blogways.net/blog/2014/01/15/apache-commons-pool.html
maxTotal 允许创建资源的最大数量,默认值 -1,-1 代表无数量限制(int类型)
blockWhenExhausted 默认值 true ,当资源耗尽时,是否阻塞等待获取资源
maxWaitMillis 获取资源时的等待时间,单位毫秒。当 blockWhenExhausted 配置为 true 时,此值有效。 -1 代表无时间限制,一直阻塞直到有可用的资源。(long类型)
testOnBorrow 默认值 false ,当设置为true时,调用 factory.validateObject() 方法
testOnCreate 默认值 false,当设置为true时,调用 factory.validateObject() 方法
(备注:如果 testOnBorrow 或者 testOnCreate 中有一个 配置 为 true 时,就调用 factory.validateObject() )
lifo 资源的存取数据结构,默认值 true,true 资源按照栈结构存取,false 资源按照队列结构存取
fairness 当从池中获取资源或者将资源还回池中时 是否使用 java.util.concurrent.locks.ReentrantLock.ReentrantLock 的公平锁机制。 默认值 false, true 使用公平锁,false 不使用公平锁,
timeBetweenEvictionRunsMillis 回收资源线程的执行周期,单位毫秒。默认值 -1 ,-1 表示不启用线程回收资源。(long类型)
evictionPolicyClassName 资源回收策略, 默认值 org.apache.commons.pool2.impl.DefaultEvictionPolicy(String类型)
minEvictableIdleTimeMillis 资源最小空闲时间, 默认值 1800000,单位 毫秒,(long类型 )
softMinEvictableIdleTimeMillis 软资源最小空闲时间, 默认值 -1 ,单位 毫秒,(long类型 )
(备注,这个两个参数,在资源回收策略中,会使用到)
maxIdle 最大空闲资源数,默认值 8 (int类型)
minIdle 最小空闲资源数,默认值 0 (int类型 )
testWhileIdle 默认值 false; 设置为 true 时,当回收策略返回false时,则 调用 factory.activateObject()和factory.validateObject()
testOnReturn 默认值 false; 设置为 true 时,当将资源返还个资源池时候,验证资源的有效性,调用 factory.validateObject()方法,如果无效,则调用 factory.destroyObject()方法
numTestsPerEvictionRun 资源回收线程执行一次回收操作,回收资源的数量。默认值 3, (int类型)。
备注:当 设置为0时,不回收资源。
设置为 小于0时,回收资源的个数为 (int)Math.ceil( 池中空闲资源个数 / Math.abs(numTestsPerEvictionRun) );
设置为 大于0时,回收资源的个数为 Math.min( numTestsPerEvictionRun,池中空闲的资源个数 );
从池中获取资源的逻辑
1:如果 blockWhenExhausted 配置的 为 false,从资源池中获取资源,如果获取不到,则判断当前池中的对象数量是否超过了 maxTotal 设置的数量,如果没有超过,
则通过调用factory.makeObject() 创建对象,并将对象放入池中,执行第2步 。如果超过了,则返回 null,逻辑到此结束。
如果 blockWhenExhausted 配置的 为 true ,从资源池中获取资源,如果获取不到,则判断当前池中的对象数量是否超过了 maxTotal 设置的数量,如果没有超过,
则通过调用factory.makeObject() 创建对象,并将对象放入池中,执行第2步 。如果超过了,则阻塞等待,如果 MaxWaitMillis 配置的为 -1 则 阻塞等待,直到有可用的资源为止。
如果 maxWaitMillis 配置为 1000 则 阻塞等待 1000毫秒,如果有可用资源,执行第2步,如果没有则返回 null,逻辑到此结束。
2:将资源的状态 修改为 已分配,执行 第 3 步
3:调用 factory.activateObject() 方法,执行 第 4步
4:如果 testOnBorrow 或者 testOnCreate 中有一个 配置 为 true 时,则调用 factory.validateObject() 方法
5:以上步骤都完成了,返回 资源对象
将资源返还给池的逻辑
1:检查配置参数 testOnReturn,如果 为 true,调用 factory.validateObject()方法,验证资源对象的有效性,验证结果为 true,则调用 factory.destroyObject()方法,逻辑到此结束。
验证结果为 false,则执行第 2 步。
2:调用 factory.passivateObject()方法,然后执行 第 3 步
3:将资源的状态 修改为 未分配,执行第 4 步
4:进行判断 ( 资源池是否关闭 || (maxIdle > -1 ) && ( maxIdle <= 资源池空闲资源个数) )
如果 判断为 true,则调用 factory.destroyObject()方法,逻辑到此结束。
如果 判断为 false,则 将资源返还给资源池,逻辑到此结束。
Apache_common_pool 启动一个线程执行释放资源的工作(使用 java.util.Timer 实现)
从池中回收资源逻辑(回收资源的意思是,将资源从池中删除掉,例如,如果是TCP链接,则需要将链接断开,并从池中删除掉。)
1:根据 evictionPolicyClassName 配置的参数创建回收策略,
默认回收策略源码
if条件判断与
(softMinEvictableIdleTimeMillis < 资源的空闲时间 && Math.min(maxIdle,minIdle) < 目前池中空闲的资源数) ||
minEvictableIdleTimeMillis < 资源的空闲时间
等价
2:根据配置的参数 numTestsPerEvictionRun 计算,要回收的资源数量(具体的计算规则,请参照源码)
3:根据回收策略判断,资源是否需要回收。如果 是 则将资源从池中删除,并调用factory.destroyObject()方法。
如果 否 则根据配置的 testWhileIdle 参数,判断 是否执行 factory.activateObject()和factory.validateObject() 方法。
maxTotal 允许创建资源的最大数量,默认值 -1,-1 代表无数量限制(int类型)
blockWhenExhausted 默认值 true ,当资源耗尽时,是否阻塞等待获取资源
maxWaitMillis 获取资源时的等待时间,单位毫秒。当 blockWhenExhausted 配置为 true 时,此值有效。 -1 代表无时间限制,一直阻塞直到有可用的资源。(long类型)
testOnBorrow 默认值 false ,当设置为true时,调用 factory.validateObject() 方法
testOnCreate 默认值 false,当设置为true时,调用 factory.validateObject() 方法
(备注:如果 testOnBorrow 或者 testOnCreate 中有一个 配置 为 true 时,就调用 factory.validateObject() )
lifo 资源的存取数据结构,默认值 true,true 资源按照栈结构存取,false 资源按照队列结构存取
fairness 当从池中获取资源或者将资源还回池中时 是否使用 java.util.concurrent.locks.ReentrantLock.ReentrantLock 的公平锁机制。 默认值 false, true 使用公平锁,false 不使用公平锁,
timeBetweenEvictionRunsMillis 回收资源线程的执行周期,单位毫秒。默认值 -1 ,-1 表示不启用线程回收资源。(long类型)
evictionPolicyClassName 资源回收策略, 默认值 org.apache.commons.pool2.impl.DefaultEvictionPolicy(String类型)
minEvictableIdleTimeMillis 资源最小空闲时间, 默认值 1800000,单位 毫秒,(long类型 )
softMinEvictableIdleTimeMillis 软资源最小空闲时间, 默认值 -1 ,单位 毫秒,(long类型 )
(备注,这个两个参数,在资源回收策略中,会使用到)
maxIdle 最大空闲资源数,默认值 8 (int类型)
minIdle 最小空闲资源数,默认值 0 (int类型 )
testWhileIdle 默认值 false; 设置为 true 时,当回收策略返回false时,则 调用 factory.activateObject()和factory.validateObject()
testOnReturn 默认值 false; 设置为 true 时,当将资源返还个资源池时候,验证资源的有效性,调用 factory.validateObject()方法,如果无效,则调用 factory.destroyObject()方法
numTestsPerEvictionRun 资源回收线程执行一次回收操作,回收资源的数量。默认值 3, (int类型)。
备注:当 设置为0时,不回收资源。
设置为 小于0时,回收资源的个数为 (int)Math.ceil( 池中空闲资源个数 / Math.abs(numTestsPerEvictionRun) );
设置为 大于0时,回收资源的个数为 Math.min( numTestsPerEvictionRun,池中空闲的资源个数 );
从池中获取资源的逻辑
1:如果 blockWhenExhausted 配置的 为 false,从资源池中获取资源,如果获取不到,则判断当前池中的对象数量是否超过了 maxTotal 设置的数量,如果没有超过,
则通过调用factory.makeObject() 创建对象,并将对象放入池中,执行第2步 。如果超过了,则返回 null,逻辑到此结束。
如果 blockWhenExhausted 配置的 为 true ,从资源池中获取资源,如果获取不到,则判断当前池中的对象数量是否超过了 maxTotal 设置的数量,如果没有超过,
则通过调用factory.makeObject() 创建对象,并将对象放入池中,执行第2步 。如果超过了,则阻塞等待,如果 MaxWaitMillis 配置的为 -1 则 阻塞等待,直到有可用的资源为止。
如果 maxWaitMillis 配置为 1000 则 阻塞等待 1000毫秒,如果有可用资源,执行第2步,如果没有则返回 null,逻辑到此结束。
2:将资源的状态 修改为 已分配,执行 第 3 步
3:调用 factory.activateObject() 方法,执行 第 4步
4:如果 testOnBorrow 或者 testOnCreate 中有一个 配置 为 true 时,则调用 factory.validateObject() 方法
5:以上步骤都完成了,返回 资源对象
将资源返还给池的逻辑
1:检查配置参数 testOnReturn,如果 为 true,调用 factory.validateObject()方法,验证资源对象的有效性,验证结果为 true,则调用 factory.destroyObject()方法,逻辑到此结束。
验证结果为 false,则执行第 2 步。
2:调用 factory.passivateObject()方法,然后执行 第 3 步
3:将资源的状态 修改为 未分配,执行第 4 步
4:进行判断 ( 资源池是否关闭 || (maxIdle > -1 ) && ( maxIdle <= 资源池空闲资源个数) )
如果 判断为 true,则调用 factory.destroyObject()方法,逻辑到此结束。
如果 判断为 false,则 将资源返还给资源池,逻辑到此结束。
Apache_common_pool 启动一个线程执行释放资源的工作(使用 java.util.Timer 实现)
从池中回收资源逻辑(回收资源的意思是,将资源从池中删除掉,例如,如果是TCP链接,则需要将链接断开,并从池中删除掉。)
1:根据 evictionPolicyClassName 配置的参数创建回收策略,
默认回收策略源码
import org.apache.commons.pool2.PooledObject; public class DefaultEvictionPolicy<T> implements EvictionPolicy<T> { 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; } }
if条件判断与
(softMinEvictableIdleTimeMillis < 资源的空闲时间 && Math.min(maxIdle,minIdle) < 目前池中空闲的资源数) ||
minEvictableIdleTimeMillis < 资源的空闲时间
等价
2:根据配置的参数 numTestsPerEvictionRun 计算,要回收的资源数量(具体的计算规则,请参照源码)
3:根据回收策略判断,资源是否需要回收。如果 是 则将资源从池中删除,并调用factory.destroyObject()方法。
如果 否 则根据配置的 testWhileIdle 参数,判断 是否执行 factory.activateObject()和factory.validateObject() 方法。
相关文章推荐
- apache-common-pool2(配置参数详解,以及资源回收,从池中获取资源,将资源返还给池 逻辑解析)
- apache-common-pool2(配置参数详解,以及资源回收,从池中获取资源,将资源返还给池 逻辑解析)
- apache-common-pool2(配置参数详解,以及资源回收,从池中获取资源,将资源返还给池 逻辑解析)
- apache-common-pool2(配置参数详解,以及资源回收,从池中获取资源,将资源返还给池
- 使用Apache模块编译安装搭建LAMP平台以及部署DedeCMS网站配置详解
- JAVAWEB开发之Struts2详解(二)——Action接受请求参数、类型转换器、使用Struts2的输入校验、以及遵守约定规则实现Struts2的零配置
- AOP后置通知获取目标方法的参数以及配置详解
- 三分钟让你学会如何使用 apache-common-pool2 创建自己的资源池
- [J2EE]DBCP、C3P0、Proxool三大连接池的配置参数说明和使用详解
- Quartz.net官方开发指南 第十课: 配置、资源使用以及SchedulerFactory
- syntaxhighlighter 使用 配置 参数 详解 代码高亮 纯JS
- Quartz.net官方开发指南 第十课: 配置、资源使用以及SchedulerFactory
- 详细解释:nginx中gzip的各项配置以及配置参数的意思详解
- CentOS RedHat 5 Yum源使用配置及相关参数详解
- 在apache配置文件中使用IfDefine以及IfModule指令来快速更改配置
- 使用Log4j为项目配置日志输出应用详解以及示例演示的实现分析
- 如何使用Ajax(XMLHttpRequest)发送带参数的请求,以及如何在Servlet中获取请求中的参数
- 安卓中使用SharedPreferences实现软件参数的保存和从另外一个资源获取保存结果
- JVM参数详解以及配置调优
- Apache+Tomcat 中文资源,以及中文URL中参数中文问题!