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