commons.pool2使用 GenericObjectPool GenericKeyedObjectPool 应用场景 代码示例
- 2023-01-01 17:04:00
- admin
- 原创 2783
一、commons.pool2使用
maven配置:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.5.0</version>
</dependency>
继承说明:
GenericObjectPool继承BaseGenericObjectPool
GenericKeyedObjectPool继承BaseGenericObjectPool
对象池参数说明:
BaseGenericObjectPool默认参数:
lifo true 默认空闲对象后进先出
maxTotal -1 连接池对象不限制
blockWhenExhausted true 获取不到对象堵塞
maxWaitMillis -1 默认堵塞时间为永久
testOnCreate false 默认borrowObject创建对象不做validateObject
testOnBorrow false 默认borrowObject获取对象不做validateObject
testOnReturn false 默认returnObject归还对象不做validateObject
testWhileIdle false
GenericObjectPool默认参数:
maxIdle 8 最大空闲对象数,returnObject根据该值决定是否销毁对象。
minIdle 0 最小空闲对象数,preparePool函数使用该值初始化对象池。
GenericObjectPoolConfig:
jmxEnabled true 默认打开jmx监控
jmxNameBase null 非null时优先级高于ONAME_BASE
jmxNamePrefix pool 前缀默认值pool
GenericKeyedObjectPool默认参数:
无
工厂类说明:
PooledObjectFactory:提供对象生命周期中调用方法。
makeObject:创建对象,返回null或者抛出异常会导致异常抛出。
activateObject:
1 激活对象,每次borrowObject一定会调用。
2 激活失败,则销毁对象,并在尝试再去获取一个对象。
3 如果获取的对象是刚刚创建的,激活失败,则销毁对象,并抛出异常NoSuchElementException。
passivateObject:冻结对象,每次returnObject一定会调用,抛出异常导致对象会被销毁,且异常被吞噬。
validateObject:
borrowObject时,验证操作在activateObject之后:
1 验证失败,则销毁对象,并在尝试再去获取一个对象。
2 如果获取的对象是刚刚创建的,验证失败,则销毁对象,并抛出异常NoSuchElementException。
returnObject时,验证操作在passivateObject之前:抛出异常导致对象会被销毁,且异常被吞噬。
BasePooledObjectFactory:PooledObjectFactory适配器,只用实现create和wrap方法。
create:返回null或者抛出异常会导致异常抛出。
对象池说明:
BaseGenericObjectPool:对象池基类
todo
GenericObjectPool:通用对象池
preparePool:初始化对象池,保证对象池有minIdle对象,可能抛异常。
addObject:初始化对象池,给对象池添加一个对象,如果对象池已满,则什么操作都不做。
borrowObject:从对象池取得一个对象。
1 blockWhenExhausted=false,maxTotal对象使用完,立即抛出NoSuchElementException:Pool exhausted
2 blockWhenExhausted=true,maxTotal对象使用完,会等待maxWaitMillis毫秒,超时抛出NoSuchElementException异常。
returnObject:归还一个对象到对象池。
invalidateObject:从对象池删除一个对象,如果有线程在等待对象,则会再创建一个对象。
getNumIdle:返回空闲对象个数。
getNumActive:返回被使用的对象个数。
clear:清除所有的空闲对象,释放闲置资源。
close:关闭对象池,释放对象池所有资源,close之后borrowObject会产生异常,returnObject不会产生异常。
二、开源应用场景
jedis redis客户端api
dbcp 数据库连接池