一、背景介绍
创建新的对象并初始化的操作,可能会消耗很多的时间。在需要频繁创建并使用这些对象的场景中,为了提供系统性能,通常的做法是,创建一个对象池,将一定数量的对象缓存到这个对象池中。需要使用时直接从对象池中取出对象,使用完后将对象扔回到对象池中即可。Apache的commons pool组件是我们实现对象池化技术的良好助手。
二、组件基本介绍
该项目是一个基本的对象池组件;Pool提供三个主要方面对象池的API:
a) 一个提供客户方和实现方用来实现简单、可变的对象池的基本接口。
b) 一个用来创建模块化对象池的工具。
c) 几个通用的对象池的实现。
三、组件特点
org.apache.commons.pool包定义了一部分在创建一个新的对象池实现时十分有用的接口和基本类。
四、对象池
(1)ObjectPool
ObjectPool定义了一个简单小巧的池化接口,主要有GenericObjectPool、StackObjectPool、SoftReferenceObjectPool三个实现类;
a)GenericObjectPool:可配置LIFO/FIFO行为的ObjectPool的实现。默认采用LIFO队列方式。这意味着当有闲置的可用对象在对象池中时,borrowObject方法会返回最近的实例。如果配置文件中的lifo配置项的值为false,则将返回相反排序的实例,也就是会返回最先进入对象池的对象的实例。
b)StackObjectPool:使用LIFO行为实现的ObjectPool。
c)SoftReferenceObjectPool:使用LIFO行为实现的ObjectPool。此外,在这个对象池实现中,每个对象都会被包装到一个SoftReference中。SoftReference允许垃圾回收机制在需要释放内存时回收对象池中的对象。
(2)KeyedObjectPool
KeyedObjectPool对象池有多种类型情况的对象池的实现,每种类型对应一个任意的键值,组件给出了GenericKeyedObjectPool、StackKeyedObjectPool两个基本的实现类;
a)GenericKeyedObjectPool:通过FIFO行为实现的对象池。
b)StackKeyedObjectPool:通过LIFO行为实现的对象池。
五、PoolableObjectFactory、ObjectPool及ObjectPoolFactory
在commons pool组件中,对象池化的工作被划分给了三类对象: PoolableObjectFactoryExample.java
(1) PoolableObjectFactory用于管理池化对象的产生、激活、挂起、校验和销毁;
(2) ObjectPool用于管理要被池化的对象的借出和归还,同时通知PoolableObjectFactory完成相应的工作;
(3) ObjectPoolFactory则用于大量生成相同类型和设置的ObjectPool;
相应的,使用Pool组件的过程,也可大体划分成“实现自己的PoolableObjectFactory”、“使用
ObjectPool”和可选的“利用ObjectPoolFactory”三个步骤。
(1) 实现自己的PoolableObjectFactory
ObjectPool的实例在需要处理池化的对象的产生、激活、挂起、校验和销毁工作时,就会调用跟它
关联在一起的PoolableObjectFactory实例的相应方法来操作。PoolableObjectFactory是commons-pool
中定义个一个接口,Pool组件中没有包含任何一种PoolableObjectFactory实现,需要根据情况自行创立。
// 该方法用于产生你要放入到对象池中的新对象
Object makeObject() throws Exception;
// 该方法用于销毁对象
void destroyObject(Object obj) throws Exception;
/** 该方法用于校验对象是否有效,对于失效的对象会调用
* destroyObject方法进行销毁
*/
boolean validateObject(Object obj);
/** 该方法用于将对象“激活”,对于可变对象,该方法主要是
* 对象恢复成初始状态
*/
void activateObject(Object obj) throws Exception;
// 该方法用于将对象“挂起”,将对象设置为休眠状态即不可用
void passivateObject(Object obj) throws Exception;
ObjectPool是Pool组件中定义的一个接口,实际使用的时候同样需要利用这个接口的具
体实现。Pool组件本身提供了几种实现,可以直接使用。当然也可以自行创建。
ObjectPool的使用方法:
(a)、 生成一个要用的PoolableObjectFactory类的实例
PoolableObjectPoolFactory factory = new PoolableObjectPoolFactoryExample();
(b)、 利用PoolableObjectPoolFactory实例为参数,生成一个实现了ObjectPool接口的类的实
例,作为对象池ObjectPool pool = new StackObjectPool(factory);
(c)、 需要从对象池中获取对象时,调用对应的borrowObject()方法Object obj = pool.borrowObject();
(d)、 将对象放回对象池中,调用returnObject(Object obj)方法pool.returnObject(obj);
(e)、 当不再需要对象池时,直接调用对象池上的close()方法,释放资源。pool.close();
另外,ObjectPool接口还定义了几个可以由具体的实现决定要不要支持的操作,包括:
void clear()
清除所有当前在此对象池中休眠的对象。
int getNumActive()
返回已经从此对象池中借出的对象的总数。
int getNumIdle()
返回当前在此对象池中休眠的对象的数目。
void setFactory(PoolableObjectFactory factory)
将当前对象池与参数中给定的PoolableObjectFactory相关联。如果在当前状态下,无法
完成这一操作,会有一个IllegalStateException异常抛出。
(3)使用ObjectPoolFactory
ObjectPoolFactory是Pool组件中定义的一个接口,它定义了一个createPool()方法,可以
用于大量产生类型和设置都相同的ObjectPool的对象。
Pool组件中,对每一个ObjectPool的实现,都有一个对应的ObjectPoolFactory实现。
最后给出一个较为完整的例子:
package org.apache.commons.pool;
public class PoolableObjectFactoryExample implements PoolableObjectFactory
{
/**
* 一个简单的实现PoolableObjectPool接口的例子
*/
private static int count = 0;
/**
* 将对象设置为激活状态
* 对于可变对象,可以使用编码方式将对象转变为初始状态
*/
@Override
public void activateObject(Object obj) throws Exception
{
System.out.println("destroyObject run + " + obj);
}
/**
* 销毁池化对象的方法
*/
@Override
public void destroyObject(Object obj) throws Exception
{
System.out.println("destroyObject run + " + obj);
}
/**
* 创建池化对象的方法
*/
@Override
public Object makeObject() throws Exception
{
String obj = String.valueOf(count);
System.out.println("makeObject run + " + obj);
return obj;
}
/**
* 将池化对象设置为休眠状态,表示该对象不可用
*/
@Override
public void passivateObject(Object obj) throws Exception
{
System.out.println("passivateObject run + " + obj);
}
/**
* 校验池化对象是否可用的方法
*/
@Override
public boolean validateObject(Object obj)
{
boolean flag = false;
if(obj.equals(obj))
{
flag = true;
}
return flag;
}
}
ObjectPoolExample.java
package org.apache.commons.pool;
import org.apache.commons.pool.impl.StackObjectPoolFactory;
public class ObjectPoolExample
{
public static void main(String[] args)
{
// 生成PoolableObjectFactory实例
PoolableObjectFactory _factory = new PoolableObjectFactoryExample();
// 生成一个ObjectPoolFactory实例
ObjectPoolFactory objFactory = new StackObjectPoolFactory(_factory);
// 生成一个ObjectPool实例
ObjectPool pool = objFactory.createPool();
// 获取对象池中的一个可用对象
try
{
Object obj = pool.borrowObject();
// 使用对象
pool.returnObject(obj);
obj = null;
}
catch(Exception ex)
{
ex.printStackTrace();
}
finally
{
try
{
// 关闭对象池
pool.close();
pool = null;
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
}
分享到:
相关推荐
Apache Commons Pool 提供了通用的对象池API,它包括以下几个核心组件: 1. **PooledObjectFactory**:这是创建和管理池中对象的核心接口。它定义了创建、验证、激活、钝化和销毁对象的方法。 2. **...
标题中的"commons-pool-1.6.jar.zip"表明这是一个包含Apache Commons Pool 1.6版本的压缩文件,其中的核心组件是`commons-pool-1.6.jar`。 **Apache Commons Pool 概述** Apache Commons Pool 是Apache软件基金会的...
Apache Commons Pool 是一个广泛使用的开源组件,主要用于提供对象池化的实现。在Java世界里,对象池化是一种优化资源管理的重要技术,通过复用已创建的对象,避免频繁的创建和销毁过程,从而提升系统性能。最新版本...
Jakarta Commons Pool是一个用于在Java程序中实现对象池化的组件。...单纯地使用Pool组件不需要太多的Java 2的知识和经验,对语法和基本概念(对象、异常、类、接口、实例、继承和实现等)有一般了解即可。
Apache Commons DBCP(数据库连接池)和Apache Commons Pool是两个在Java开发中广泛使用的开源库,主要用于管理和优化数据库连接的使用。这两个组件是高效、可靠的数据库操作背后的关键技术。 Apache Commons Pool...
7. **兼容性与扩展性**:Apache Commons Pool 2 兼容Java 6及更高版本,并且与其他Apache Commons组件兼容,易于集成到现有的应用程序中。同时,它的设计允许开发者根据需求扩展其功能,实现自定义的对象池。 8. **...
《Apache Commons Pool详解:连接池的关键组件》 Apache Commons Pool是Java编程领域中一个重要的开源库,主要用于对象池化,特别是在数据库连接管理方面扮演着核心角色。标题中的"commons-pool.jar"即为此库的可...
DBCP(DataBase Connection Pool)是 apache common上的一个 java 连接池项目,也是 tomcat 使用的连接池组件,依赖 于Jakarta commons-pool 对象池机制,DBCP可以直接的在应用程序中使用。 使用DBCP会用到commons-...
Apache Commons Pool则是Apache Commons项目下的另一个组件,专注于对象池的实现。`commons-pool-1.5.6.jar` 提供了一套通用的对象池服务,DBCP利用它来管理数据库连接对象。对象池技术可以有效地复用对象,减少创建...
Apache Commons Pool和DBCP是Java开发中重要的组件,它们为高效管理和复用数据库连接提供了强大的工具。通过使用这些库,开发者可以构建更稳定、性能更优的数据库驱动的应用程序。在实际项目中,正确配置和使用DBCP...
Apache Commons Pool 是一个开源的Java对象池库,版本1.4是该项目的一个稳定版本。对象池的概念是为了提高性能和资源管理,通过复用已创建的对象而不是每次需要时都创建新的对象。在Java应用中,特别是在大型企业级...
Apache Commons Pool2的主要特点和组件包括: 1. **通用对象池接口**:`org.apache.commons.pool2.PooledObjectFactory` 和 `org.apache.commons.pool2.Poolable` 接口,定义了对象池的基本操作和对象的池化行为。 ...
总的来说,`commons-pool2-2.4.2.jar` 是MyBatis二级缓存与Redis集成的关键组件,通过提供对象池化服务,优化了Redis连接的管理,提高了整体系统的效率和响应速度。了解并正确配置Apache Commons Pool2,有助于...
Apache Commons DBCP(Database Connection Pool)是基于Apache Commons Pool的数据库连接池组件。它提供了一个数据库连接池,用于存储和管理数据库连接。在"commons-dbcp-1.2.2.jar"中,DBCP集成了Pool,实现了对...
Apache Commons Pool 2是一个通用的对象池服务,它是Apache Commons组件的一部分。在Jedis中,它被用来实现对象池化,特别是Redis连接的池化。连接池允许应用程序重复使用已经创建的Redis连接,而不是每次需要时都...
Apache Commons Pool 1.6是Java开发中一个重要的工具库,专门用于对象池化服务。...9. **与其他组件集成**:在实际应用中,Apache Commons Pool常与Apache Commons DBCP(数据库连接池)一起使用,DBC
Apache Commons Pool是Apache的一个通用对象池库,它为其他组件提供了创建和管理对象池的基础设施。DBCP依赖于Commons Pool来实现连接池的内部管理。 在Commons Pool中,主要的类有: 1. `GenericObjectPool`: 这是...
它是基于Pool2实现的一个数据库连接池组件。数据库连接池在应用服务器中扮演着重要角色,它能有效地管理和复用数据库连接,避免了每次数据库操作都需要建立和关闭连接的性能瓶颈。DBCP2提供了`BasicDataSource`类,...