Apache common-pool2 GenericObjectPool的使用
对象池是一种池化技术。设计模式中的享元模式就是说的一种池化的思想。项目中使用池化技术,可以大大减少因频繁申请内存和释放内存(malloc/free、new/delete)的开销,提高运行效率。例如,数据库连接池、线程池等,都是使用了池化的概念和技术。
这里我们直接使用 Apche common-pool2 中的GenericObjectPool
来快速实现一个对象池。
使用介绍
使用GenericObjectPool
只需要创建一个对象工厂类,继承BasePooledObjectFactory
并重写它的create()
和destroyObject()
。
创建对象池对象时,传入对象工厂对象和配置对象,完成对象池的创建。配置主要为对象池最大容量,最大空闲对象个数,最小空闲个数。
- maxActive: 链接池中最大连接数,默认为8.
- maxIdle: 链接池中最大空闲的连接数,默认为8.
- minIdle: 连接池中最少空闲的连接数,默认为0.如果当前测试对象的空闲时间大于config中设置的idleSoftEvictTime并且pool中空闲对象的数量大于minIdle,那么就会return true。然后就会回收销毁该对象。
其中EvictionConfig中的idleSoftEvictTime和idleEvictTime的默认值是在BaseObjectPoolConfig中定义的。 - maxWait: 当连接池资源耗尽时,调用者最大阻塞的时间,超时将跑出异常。单位,毫秒数;默认为-1.表示永不超时.
- minEvictableIdleTimeMillis: 连接空闲的最小时间,达到此值后空闲连接将可能会被移除。负值(-1)表示不移除。
- softMinEvictableIdleTimeMillis: 连接空闲的最小时间,达到此值后空闲链接将会被移除,且保留“minIdle”个空闲连接数。默认为-1.
- numTestsPerEvictionRun: 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.
- testOnBorrow: 向调用者输出“链接”资源时,是否检测是有有效,如果无效则从连接池中移除,并尝试获取继续获取。默认为false。建议保持默认值.
- testOnReturn: 向连接池“归还”链接时,是否检测“链接”对象的有效性。默认为false。建议保持默认值.
- testWhileIdle: 向调用者输出“链接”对象时,是否检测它的空闲超时;默认为false。如果“链接”空闲超时,将会被移除。建议保持默认值.
- timeBetweenEvictionRunsMillis: “空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.
- whenExhaustedAction: 当“连接池”中active数量达到阀值时,即“链接”资源耗尽时,连接池需要采取的手段, 默认为1:
-> 0 : 抛出异常,
-> 1 : 阻塞,直到有可用链接资源
-> 2 : 强制创建新的链接资源
代码示例
例如,自定义对象工厂:
/**
* @Description 人脸引擎对象工厂
* @Author yin.jinbiao
* @Date 2021/9/27 14:12
* @Version 1.0
*/
@Slf4j
public class FaceEngineFactory extends BasePooledObjectFactory<FaceEngine> {
private String libPath;
private String appId;
private String sdkKey;
private EngineConfiguration engineConfiguration;
public FaceEngineFactory(String libPath, String appId, String sdkKey, EngineConfiguration engineConfiguration) {
this.appId = appId;
this.sdkKey = sdkKey;
this.libPath = libPath;
this