Apache Commons 系列简介 之 Pool

简介: 一、概述Apache Commons Pool库提供了一整套用于实现对象池化的API,以及若干种各具特色的对象池实现。2.0版本,并非是对1.x的简单升级,而是一个完全重写的对象池的实现,显著的提升了性能和可伸缩性,并且包含可靠的实例跟踪和池监控。

一、概述

Apache Commons Pool库提供了一整套用于实现对象池化的API,以及若干种各具特色的对象池实现。2.0版本,并非是对1.x的简单升级,而是一个完全重写的对象池的实现,显著的提升了性能和可伸缩性,并且包含可靠的实例跟踪和池监控。第二版要求JDK1.6+。

二、下载

官方下载页:

http://commons.apache.org/proper/commons-pool/download_pool.cgi

源码:

svn checkout http://svn.apache.org/repos/asf/commons/proper/pool/trunk commons-pool2

Maven工程依赖

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.0</version>
</dependency>

三、使用说明

3.1 创建池化对象

创建池化对象很简单,只要实现commons-poolPooledObjectFactory工厂接口就行了。

PooledObjectFactory是一个池化对象工厂接口,定义了生成对象、激活对象、钝化对象、销毁对象的方法,如下:

public interface PooledObjectFactory<T> {
    PooledObject<T> makeObject();
    void activateObject(PooledObject<T> obj);
    void passivateObject(PooledObject<T> obj);
    boolean validateObject(PooledObject<T> obj);
    void destroyObject(PooledObject<T> obj);
}

它创建并管理PooledObjectPooledObject包含了池化的对象实例,以及这些实例的池化属性,比如创建时间、最后使用时间等等。

如果需要使用Commons-Pool,那么你就需要提供一个PooledObjectFactory接口的具体实现。一个比较简单的办法就是,继承BasePooledObjectFactory这个抽象类。而继承这个抽象类,只需要实现两个方法:create()wrap(T obj)

实现create()方法很简单,而实现wrap(T obj)也有捷径,可以使用类DefaultPooledObject ,代码可以参考如下:

@Override
public PooledObject<Foo> wrap(Foo foo) {
    return new DefaultPooledObject<Foo>(foo);
}

比如,一个完整的例子:

package test.test;

import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;

public class StringBufferFactory extends BasePooledObjectFactory<StringBuffer> {

	@Override
	public StringBuffer create() throws Exception {
		return new StringBuffer();
	}

	@Override
	public PooledObject<StringBuffer> wrap(StringBuffer obj) {
		return new DefaultPooledObject<StringBuffer>(obj);
	}

}

有时候,单用对池内所有对象一视同仁的对象池,并不能解决问题。例如,有时需要通过key来获取不同的对象,这样,就有可能取出不合用的对象的麻烦。当然,可以通过为每一组参数相同的同类对象建立一个单独的对象池来解决这个问题。但是,如果使用普通的ObjectPool来实施这个计策的话,因为普通的PooledObjectFactory只能生产出大批设置完全一致的对象,就需要为每一组参数相同的对象编写一个单独的PooledObjectFactory,工作量相当可观。这种时候就可以使用BaseKeyedPooledObjectFactory来替代BasePooledObjectFactory.这个类,实现的是KeyedPooledObjectFactory接口,和PooledObjectFactory接口类似,只是在相关的方法中多了Key参数,定义如下:

public interface KeyedPoolableObjectFactory<K,V> {
    PooledObject<V> makeObject(K key);
    void activateObject(K key, PooledObject<V> obj);
    void passivateObject(K key, PooledObject<V> obj);
    boolean validateObject(K key, PooledObject<V> obj);
    void destroyObject(K key, PooledObject<V> obj);
}

3.2 创建对象池

org.apache.commons.pool2.impl中预设了三个可以直接使用的对象池:GenericObjectPoolGenericKeyedObjectPoolSoftReferenceObjectPool

通常使用GenericObjectPool来创建对象池,如果是对象池是Keyed的,那么可以使用GenericKeyedObjectPool来创建对象池。这两个类都提供了丰富的配置选项。这两个对象池的特点是可以设置对象池中的对象特征,包括LIFO方式、最大空闲数、最小空闲数、是否有效性检查等等。两者的区别如前面所述,后者支持Keyed

SoftReferenceObjectPool对象池,它利用一个java.util.ArrayList对象来保存对象池里的对象。不过它并不在对象池里直接保存对象本身,而是保存它们的“软引用”(Soft Reference)。这种对象池的特色是:可以保存任意多个对象,不会有容量已满的情况发生;在对象池已空的时候,调用它的borrowObject方法,会自动返回新创建的实例;可以在初始化同时,在池内预先创建一定量的对象;当内存不足的时候,池中的对象可以被Java虚拟机回收。

举个例子:

new GenericObjectPool<StringBuffer>(new StringBufferFactory());

我们也可以使用GenericObjectPoolConfig来对上面创建的对象池进行一些参数配置,创建的Config参数,可以使用setConfig方法传给对象池,也可以在对象池的构造方法中作为参数传入。

举个例子:

GenericObjectPoolConfig conf = new GenericObjectPoolConfig();
conf.setMaxTotal(20);
conf.setMaxIdle(10);
...
GenericObjectPool<StringBuffer> pool = new GenericObjectPool<StringBuffer>(new StringBufferFactory(), conf);

3.3 使用对象池

对象池使用起来很方便,简单一点就是使用borrowObjectreturnObject两个方法,直接给参考代码吧:

StringBuffer buf = null;
try { 
    buf = pool.borrowObject();
    ...         
} catch(IOException e) { 
    throw e; 
} catch(Exception e) {
    throw new RuntimeException("Unable to borrow buffer from pool" + 
          e.toString());
} finally { 
    try {
        if(null != buf) {
            pool.returnObject(buf);
        }
    } catch(Exception e) {
        // ignored
    }
} 






 
相关文章
|
6月前
|
Java 应用服务中间件 Apache
简介Nginx,Tomcat和 Apache
简介Nginx,Tomcat和 Apache
112 2
简介Nginx,Tomcat和 Apache
|
12月前
|
Apache
java.lang.NoClassDefFoundError: org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream
java.lang.NoClassDefFoundError: org/apache/commons/io/output/UnsynchronizedByteArrayOutputStream
522 0
|
5月前
|
Java 数据库连接 Apache
深入理解Apache Commons Pool2池化技术
深入理解Apache Commons Pool2池化技术
|
6月前
|
消息中间件 JSON Kafka
实战 | Apache Hudi回调功能简介及使用示例
实战 | Apache Hudi回调功能简介及使用示例
48 0
|
6月前
|
算法 Java Apache
Apache Commons
Apache Commons是一个开源项目,提供了一系列的工具和库,用于简化Java开发中的常见任务。
61 1
|
6月前
|
数据挖掘 关系型数据库 MySQL
下一代实时数据库:Apache Doris 【一】简介
下一代实时数据库:Apache Doris 【一】简介
160 0
下一代实时数据库:Apache Doris 【一】简介
|
6月前
|
SQL 分布式计算 数据处理
Apache Spark简介与历史发展
Apache Spark简介与历史发展
|
6月前
|
SQL 分布式计算 数据处理
[AIGC] Apache Spark 简介
[AIGC] Apache Spark 简介
|
12月前
|
Java 关系型数据库 Apache
Apache Maven简介&安装及系统坏境配置&eclipse配置Apache Maven---详细介绍
Apache Maven简介&安装及系统坏境配置&eclipse配置Apache Maven---详细介绍
142 0
|
开发框架 负载均衡 Dubbo
带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 Dubbo简介
带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 Dubbo简介
918 5
带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 Dubbo简介

推荐镜像

更多