一、背景介紹
創(chuàng)建新的對(duì)象并初始化的操作,可能會(huì)消耗很多的時(shí)間。在需要頻繁創(chuàng)建并使用這些對(duì)象的場(chǎng)景中,為了提供系統(tǒng)性能,通常的做法是,創(chuàng)建一個(gè)對(duì)象池,將一定數(shù)量的對(duì)象緩存到這個(gè)對(duì)象池中。需要使用時(shí)直接從對(duì)象池中取出對(duì)象,使用完后將對(duì)象扔回到對(duì)象池中即可。Apache的commons
pool組件是我們實(shí)現(xiàn)對(duì)象池化技術(shù)的良好助手。
二、組件基本介紹
該項(xiàng)目是一個(gè)基本的對(duì)象池組件;Pool提供三個(gè)主要方面對(duì)象池的API:
a)
一個(gè)提供客戶方和實(shí)現(xiàn)方用來(lái)實(shí)現(xiàn)簡(jiǎn)單、可變的對(duì)象池的基本接口。
b)
一個(gè)用來(lái)創(chuàng)建模塊化對(duì)象池的工具。
c)
幾個(gè)通用的對(duì)象池的實(shí)現(xiàn)。
三、組件特點(diǎn)
org.apache.commons.pool包定義了一部分在創(chuàng)建一個(gè)新的對(duì)象池實(shí)現(xiàn)時(shí)十分有用的接口和基本類。
四、對(duì)象池
(1)ObjectPool
ObjectPool定義了一個(gè)簡(jiǎn)單小巧的池化接口,主要有GenericObjectPool、StackObjectPool、SoftReferenceObjectPool三個(gè)實(shí)現(xiàn)類;
a)GenericObjectPool:可配置LIFO/FIFO行為的ObjectPool的實(shí)現(xiàn)。默認(rèn)采用LIFO隊(duì)列方式。這意味著當(dāng)有閑置的可用對(duì)象在對(duì)象池中時(shí),borrowObject方法會(huì)返回最近的實(shí)例。如果配置文件中的lifo配置項(xiàng)的值為false,則將返回相反排序的實(shí)例,也就是會(huì)返回最先進(jìn)入對(duì)象池的對(duì)象的實(shí)例。
b)StackObjectPool:使用LIFO行為實(shí)現(xiàn)的ObjectPool。
c)SoftReferenceObjectPool:使用LIFO行為實(shí)現(xiàn)的ObjectPool。此外,在這個(gè)對(duì)象池實(shí)現(xiàn)中,每個(gè)對(duì)象都會(huì)被包裝到一個(gè)SoftReference中。SoftReference允許垃圾回收機(jī)制在需要釋放內(nèi)存時(shí)回收對(duì)象池中的對(duì)象。
(2)KeyedObjectPool
KeyedObjectPool對(duì)象池有多種類型情況的對(duì)象池的實(shí)現(xiàn),每種類型對(duì)應(yīng)一個(gè)任意的鍵值,組件給出了GenericKeyedObjectPool、StackKeyedObjectPool兩個(gè)基本的實(shí)現(xiàn)類;
a)GenericKeyedObjectPool:通過(guò)FIFO行為實(shí)現(xiàn)的對(duì)象池。
b)StackKeyedObjectPool:通過(guò)LIFO行為實(shí)現(xiàn)的對(duì)象池。
五、PoolableObjectFactory、ObjectPool及ObjectPoolFactory
在commons
pool組件中,對(duì)象池化的工作被劃分給了三類對(duì)象:
PoolableObjectFactoryExample.java
(1)
PoolableObjectFactory用于管理池化對(duì)象的產(chǎn)生、激活、掛起、校驗(yàn)和銷毀;
(2)
ObjectPool用于管理要被池化的對(duì)象的借出和歸還,同時(shí)通知PoolableObjectFactory完成相應(yīng)的工作;
(3)
ObjectPoolFactory則用于大量生成相同類型和設(shè)置的ObjectPool;
相應(yīng)的,使用Pool組件的過(guò)程,也可大體劃分成“實(shí)現(xiàn)自己的PoolableObjectFactory”、“使用
ObjectPool”和可選的“利用ObjectPoolFactory”三個(gè)步驟。
(1) 實(shí)現(xiàn)自己的PoolableObjectFactory
ObjectPool的實(shí)例在需要處理池化的對(duì)象的產(chǎn)生、激活、掛起、校驗(yàn)和銷毀工作時(shí),就會(huì)調(diào)用跟它
關(guān)聯(lián)在一起的PoolableObjectFactory實(shí)例的相應(yīng)方法來(lái)操作。PoolableObjectFactory是commons-pool
中定義個(gè)一個(gè)接口,Pool組件中沒(méi)有包含任何一種PoolableObjectFactory實(shí)現(xiàn),需要根據(jù)情況自行創(chuàng)立。
Java代碼 
- // 該方法用于產(chǎn)生你要放入到對(duì)象池中的新對(duì)象
-
Object makeObject() throws Exception;
-
- // 該方法用于銷毀對(duì)象
- void destroyObject(Object obj) throws Exception;
-
-
- boolean validateObject(Object obj);
-
-
- void activateObject(Object obj) throws Exception;
-
- // 該方法用于將對(duì)象“掛起”,將對(duì)象設(shè)置為休眠狀態(tài)即不可用
- void passivateObject(Object obj) throws Exception;
ObjectPool是Pool組件中定義的一個(gè)接口,實(shí)際使用的時(shí)候同樣需要利用這個(gè)接口的具
體實(shí)現(xiàn)。Pool組件本身提供了幾種實(shí)現(xiàn),可以直接使用。當(dāng)然也可以自行創(chuàng)建。
ObjectPool的使用方法:
(a)、
生成一個(gè)要用的PoolableObjectFactory類的實(shí)例
PoolableObjectPoolFactory factory
= new
PoolableObjectPoolFactoryExample();
(b)、
利用PoolableObjectPoolFactory實(shí)例為參數(shù),生成一個(gè)實(shí)現(xiàn)了ObjectPool接口的類的實(shí)
例,作為對(duì)象池ObjectPool pool = new
StackObjectPool(factory);
(c)、
需要從對(duì)象池中獲取對(duì)象時(shí),調(diào)用對(duì)應(yīng)的borrowObject()方法Object
obj =
pool.borrowObject();
(d)、
將對(duì)象放回對(duì)象池中,調(diào)用returnObject(Object
obj)方法pool.returnObject(obj);
(e)、
當(dāng)不再需要對(duì)象池時(shí),直接調(diào)用對(duì)象池上的close()方法,釋放資源。pool.close();
另外,ObjectPool接口還定義了幾個(gè)可以由具體的實(shí)現(xiàn)決定要不要支持的操作,包括:
void
clear()
清除所有當(dāng)前在此對(duì)象池中休眠的對(duì)象。
int
getNumActive()
返回已經(jīng)從此對(duì)象池中借出的對(duì)象的總數(shù)。
int
getNumIdle()
返回當(dāng)前在此對(duì)象池中休眠的對(duì)象的數(shù)目。
void
setFactory(PoolableObjectFactory factory)
將當(dāng)前對(duì)象池與參數(shù)中給定的PoolableObjectFactory相關(guān)聯(lián)。如果在當(dāng)前狀態(tài)下,無(wú)法
完成這一操作,會(huì)有一個(gè)IllegalStateException異常拋出。
(3)使用ObjectPoolFactory
ObjectPoolFactory是Pool組件中定義的一個(gè)接口,它定義了一個(gè)createPool()方法,可以
用于大量產(chǎn)生類型和設(shè)置都相同的ObjectPool的對(duì)象。
Pool組件中,對(duì)每一個(gè)ObjectPool的實(shí)現(xiàn),都有一個(gè)對(duì)應(yīng)的ObjectPoolFactory實(shí)現(xiàn)。
最后給出一個(gè)較為完整的例子:
Java代碼 
- package org.apache.commons.pool;
-
- public class PoolableObjectFactoryExample implements PoolableObjectFactory
- {
-
-
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
Java代碼 
- package org.apache.commons.pool;
-
- import org.apache.commons.pool.impl.StackObjectPoolFactory;
-
- public class ObjectPoolExample
- {
-
public static void main(String[] args)
-
{
-
// 生成PoolableObjectFactory實(shí)例
-
PoolableObjectFactory _factory = new PoolableObjectFactoryExample();
-
// 生成一個(gè)ObjectPoolFactory實(shí)例
-
ObjectPoolFactory objFactory = new StackObjectPoolFactory(_factory);
-
// 生成一個(gè)ObjectPool實(shí)例
-
ObjectPool pool = objFactory.createPool();
-
// 獲取對(duì)象池中的一個(gè)可用對(duì)象
-
try
-
{
-
Object obj = pool.borrowObject();
-
// 使用對(duì)象
-
pool.returnObject(obj);
-
obj = null;
-
}
-
catch(Exception ex)
-
{
-
ex.printStackTrace();
-
}
-
finally
-
{
-
try
-
{
-
// 關(guān)閉對(duì)象池
-
pool.close();
-
pool = null;
-
}
-
catch(Exception ex)
-
{
-
ex.printStackTrace();
-
}
-
}
-
}
- }
來(lái)自http://blog.sina.com.cn/s/blog_9076f9ba01016fap.html
|