文档章节

apache-common-pool2使用以及(配置参数详解,以及资源回收,从池中获取资源,将资源返还给池)

weiliu007
 weiliu007
发布于 2016/12/07 10:13
字数 1310
阅读 54
收藏 0
点赞 0
评论 0

使用方式参考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 配置的参数创建回收策略,

默认回收策略源码

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() 方法。

© 著作权归作者所有

共有 人打赏支持
weiliu007
粉丝 14
博文 171
码字总数 84766
作品 0
深圳
程序员
GenericObjectPool参数解析

序 本文主要解析一下apache common pools下的GenericObjectPool的参数设置 GenericObjectPool commons-pool2-2.4.2-sources.jar!/org/apache/commons/pool2/impl/GenericObjectPool.java 默认......

go4it
2017/10/18
0
0
apache-common-pool2(配置参数详解,以及资源回收,从池中获取资源,将资源返还给池

maxTotal 允许创建资源的最大数量,默认值 -1,-1 代表无数量限制(int类型) blockWhenExhausted 默认值 true ,当资源耗尽时,是否阻塞等待获取资源 maxWaitMillis 获取资源时的等待时间,...

liangpeng4310
2016/01/13
928
0
基于Apache-Commons-Pool2实现Grpc客户端连接池

概述 在项目运行过程中,有些操作对系统资源消耗较大,比如建立数据库连接、建立Redis连接等操作,我们希望一次性创建多个连接对象,并在以后需要使用时能直接使用已创建好的连接,达到提高性...

lilugoodjob
昨天
0
0
Apache Common-pool2对象池浅析

Apache Common-pool2包提供了一个通用的对象池技术的实现。可以很方便的基于它来实现自己的对象池,比如DBCP和Jedis他们的内部对象池的实现就是依赖于Common-pool2。 对象的创建和销毁在一定...

同明
2016/06/14
210
0
Thrift RPC实战(四) common-pool2连接池

我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等。在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可...

lemonLove
06/21
0
0
对象池common-pool2策略分析

上一篇:对象池common-pool2分析 common-pool2策略 上一篇对象池common-pool2分析从三个主要的接口进行分析,这一篇将对源码进行详细的分析,力图找出对象池的管理策略.从之前的分析可以看出Obj...

udbwcso
2016/04/11
165
0
数据库连接池

这两天公司的事情不忙,看了一下ssh的框架,在看spring框架的时候看到数据源这一块。就想知道数据源这一块是怎么实现的,以前也有学习过数据源,但感觉没那么系统。在网上看到一个详细介绍数...

zdatbit
2016/05/12
66
0
DBCP连接池参数详解-2.4.0版本

BasicDataSource 配置参数 这些配置均在dbcp源码的BasicDataSource类的createPoolableConnectionFactory方法中使用和初始化。具体代码如下: protected PoolableConnectionFactory createPo...

二两豆腐
07/17
0
0
高效缓存Memcached集成使用说明

Memcached 介绍与分析 Memcached是一种集中式Cache,支持分布式横向扩展。总结几个它的特点来理解一下它的优点和限制。 Memory:内存存储,不言而喻,速度快,对于内存的要求高,不指出的话所...

wuxian_Abs
2014/04/12
0
1
WASCE (基于geronimo ) 配置

置数据库资源 大多数企业应用程序使用关系数据库。Community Edition 使用开放源代码的 TranQL 项目作为其数据库持久性引擎。Community Edition 提供一般资源适配器来使 JDBC 驱动程序可以作...

唐玄奘
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Weblogic问题解决记录

问题:点击登录,页面刷新但是不进去管理界面。解决:删除cookies再登录。

wffger
25分钟前
0
0
RxJava2的错误处理方案

最近使用retrofit2 + rxKotlin2写接口访问,想尽量平铺代码,于是就想到当借口返回的状态码为「不成功」时(比如:code != 200),就连同网络错误一起,统一在onError方法中处理。想法总是好的...

猴亮屏
33分钟前
0
0
程序的调试信息

调试二进制程序时,经常要借助GDB工具,跟踪程序的执行流程,获取程序执行时变量的值,以发现问题所在。GDB能得到这些信息,是因为编译程序时,编译器保存了相应的信息。Linux下的可执行程序...

qlee
55分钟前
0
0
应用级缓存

缓存命中率 从缓存中读取数据的次数与总读取次数的比例,命中率越高越好 java缓存类型 堆缓存 guavaCache Ehcache3.x 没有序列化和反序列化 堆外缓存ehcache3.x 磁盘缓存 存储在磁盘上 分布式...

writeademo
今天
0
0
python爬虫日志(3)find(),find_all()函数

1.一般来说,为了找到BeautifulSoup对象内任何第一个标签入口,使用find()方法。 以上代码是一个生态金字塔的简单展示,为了找到第一生产者,第一消费者或第二消费者,可以使用Beautiful Sou...

茫羽行
今天
0
0
java:thread:顺序执行多条线程

实现方案: 1.调用线程的join方法:阻塞主线程 2.线程池 package com.java.thread.test;public class MyThread01 implements Runnable {@Overridepublic void run() {Syste...

人觉非常君
今天
0
0
ElasticSearch 重写IK分词器源码设置mysql热词更新词库

常用热词词库的配置方式 1.采用IK 内置词库 优点:部署方便,不用额外指定其他词库位置 缺点:分词单一化,不能指定想分词的词条 2.IK 外置静态词库 优点:部署相对方便,可以通过编辑指定文...

键走偏锋
今天
19
0
Git 2.18版本发布:支持Git协议v2,提升性能

Git 2.18版本发布:支持Git协议v2,提升性能Git 2.18版本发布:支持Git协议v2,提升性能 新版本协议的主要驱动力是使 Git 服务端能够对各种 ref(分支与 tag)进行过滤操作。 这就意味着,G...

linux-tao
今天
0
0
python浏览器自动化测试库【2018/7/22-更新】

64位py2.7版本 更新 document_GetResources 枚举页面资源 document_GetresourceText 获取指定url的内容 包括页面图片 下载地址下载地址 密码:upr47x...

开飞色
今天
44
0
关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部