commons-pool对象池实现原理及使用(一)

我们知道频繁的创建对象是一个相对较重的过程,jvm要加载类,初始化对象,为对象分配内存涉及到多个系统调用,这样对一个高负载的系统来说是比较消耗资源的。这时我们可以将所需对象进行池化,apache开源的的commons-pool是一个比较经典的实现对象池化组件,笔者所在的公司在多个框架中都使用过这个组件,还有很多业界知名的中间件如Redis客户端Jedis等都使用到了这个池化组件。我们虽然不必重复造轮子,但是我们也得了解这个轮子是怎么造的。

接下来我们就从commons-pool的类层次设计、实现原理、使用这三个方面来研究一下commons-pool,我们这里以commons-pool-1.6源码进行分析,源码和jar包可以在这个链接中下载commons-pool源码和jar包官方下载

首先我们先解释如下几个概念:

对象池:就是我们要介绍的commons-pool的核心概念,类似于容器,用于存放我们需要池化的对象

对象池工厂:就是操作对象池的工程(类似于设计模式中的工程模式),这个工厂可以执行借出、归还、销毁等管理池对象的操作

池对象:就是我们需要池化的对象

池对象工厂:就是操作池对象的工厂,比如生成、验证、激活、钝化、销毁池对象

(1)commons-pool类的层次设计


这个是Commons-pool的源码包,只有两个包org.apache.commons.pool这个包下大部分都是接口和抽象类,org.apache.commons.pool.impl这个是用户可以直接使用的接口或抽象类的具体实现。

public class GenericObjectPool<T> extends BaseObjectPool<T> implements ObjectPool<T>

ObjectPool是一个顶层接口,里面定义了对象池的一些基本操作,BaseObjectPool是一个抽象类对上层接口提供了缺省实现,作为一个用户层的默认缓冲实现,这样用户就不必全部实现顶层接口的所有方法,这种缺省模式在很多地方都可以使用,GenericObjectPool是一个具体的对象池的实现。

public interface ObjectPool {
	//从对象池中借出对象
	public abstract Object borrowObject() throws Exception,NoSuchElementException, IllegalStateException;
	//将对象归还到对象池中
	public abstract void returnObject(Object obj) throws Exception;
	//使一个对象无效
	public abstract void invalidateObject(Object obj) throws Exception;
	//向对象池中添加对象
	public abstract void addObject() throws Exception, IllegalStateException,UnsupportedOperationException;
	//得到当前对象池中空闲的对象
	public abstract int getNumIdle() throws UnsupportedOperationException;
	//得到当前对象池已经借出的对象,这里的激活其实就是对象池借出对象的概念
	public abstract int getNumActive() throws UnsupportedOperationException;
	//清空对象池,并销毁对象池中的所有对象
	public abstract void clear() throws Exception,UnsupportedOperationException;
	// 关闭对象池
	public abstract void close() throws Exception;

	/**
	 * @deprecated Method setFactory is deprecated
	 *这个方法已经弃用了,池对象工程需要在实现类的构造函数中传入
	 */

	public abstract void setFactory(PoolableObjectFactory poolableobjectfactory)
			throws IllegalStateException, UnsupportedOperationException;
}

public a
  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对上述代码,我们可以使用commons-pool2提供的对象进行修改。具体实现步骤如下: 1. 引入commons-pool2的依赖包,例如在Maven项目中,在pom.xml文件中添加以下代码: ``` <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.11.1</version> </dependency> ``` 2. 创建一个连接对象,用于管理HttpClients对象的创建和回收: ```java GenericObjectPool<CloseableHttpClient> httpClientPool = new GenericObjectPool<>(new HttpClientFactory()); ``` 其中,HttpClientFactory是一个实现了PooledObjectFactory接口的类,用于创建和销毁HttpClients对象。具体实现可以参考下面的代码: ```java public class HttpClientFactory implements PooledObjectFactory<CloseableHttpClient> { @Override public PooledObject<CloseableHttpClient> makeObject() throws Exception { return new DefaultPooledObject<>(HttpClients.createDefault()); } @Override public void destroyObject(PooledObject<CloseableHttpClient> pooledObject) throws Exception { CloseableHttpClient httpClient = pooledObject.getObject(); httpClient.close(); } @Override public boolean validateObject(PooledObject<CloseableHttpClient> pooledObject) { CloseableHttpClient httpClient = pooledObject.getObject(); return httpClient != null && httpClient.getConnectionManager().isShutdown(); } @Override public void activateObject(PooledObject<CloseableHttpClient> pooledObject) throws Exception { // do nothing } @Override public void passivateObject(PooledObject<CloseableHttpClient> pooledObject) throws Exception { // do nothing } } ``` 3. 使用连接对象获取HttpClients对象,例如: ```java CloseableHttpClient httpClient = httpClientPool.borrowObject(); ``` 4. 使用完HttpClients对象后,将其归还给连接: ```java httpClientPool.returnObject(httpClient); ``` 通过上述步骤,我们就可以使用commons-pool2提供的对象来管理HttpClients对象的创建和回收了。这样可以大大减少对象的创建和销毁次数,提高程序的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值