1.對(duì)象池化技術(shù)的基本思路
將用過(guò)的對(duì)象保存起來(lái),等下一次需要這種對(duì)象的時(shí)候,再拿出來(lái)重復(fù)使用,從而在一定程度上減少頻繁創(chuàng)建對(duì)象所造成的開銷。用于充當(dāng)保存對(duì)象的“容器”的對(duì)象,被稱為“對(duì)象池”(Object Pool,或簡(jiǎn)稱Pool)。
2. Jakarta Commons Pool組件及其使用
Jakarta Commons Pool是一個(gè)用于在Java程序中實(shí)現(xiàn)對(duì)象池化的組件,它包含兩個(gè)包(org.apache.commons.pool和org.apache.commons.pool.impl)。下載commons-dbcp,將commons-pool.jar和commons-collections.jar及commons-dbcp-1.2.2.jar放到所在工程的classpath中。
3. 對(duì)象池化的工作中用到的三類對(duì)象
l PoolableObjectFactory用于管理被池化的對(duì)象的產(chǎn)生、激活、掛起、校驗(yàn)和銷毀;
l ObjectPool用于管理要被池化的對(duì)象的借出和歸還,并通知PoolableObjectFactory完成相應(yīng)的工作;
l ObjectPoolFactory則用于大量生成相同類型和設(shè)置的ObjectPool。
3.1 創(chuàng)立PoolableObjectFactory
PoolableObjectFactory是在org.apache.commons.pool包中定義的一個(gè)接口。實(shí)際使用的時(shí)候需要利用這個(gè)接口的一個(gè)具體實(shí)現(xiàn)。如下:
創(chuàng)建一個(gè)實(shí)現(xiàn)類PoolableObjectFactorySample.java
import org.apache.commons.pool.PoolableObjectFactory;
public class PoolableObjectFactorySample
implements PoolableObjectFactory {
private static int counter = 0;
/* *
*這個(gè)方法用于在必要時(shí)產(chǎn)生新的對(duì)象。
*/
public Object makeObject() throws Exception {
Object obj = String.valueOf(counter++);
System.err.println("Making Object " + obj);
return obj;
}
/* *
* 這個(gè)方法用于將對(duì)象“激活”設(shè)置為適合開始使用的狀態(tài)。
*/
public void activateObject(Object obj) throws Exception {
System.err.println("Activating Object " + obj);
}
/* *
*這個(gè)方法用于將對(duì)象“掛起”設(shè)置為適合開始休眠的狀態(tài)。
*/
public void passivateObject(Object obj) throws Exception {
System.err.println("Passivating Object " + obj);
}
/* *
*這個(gè)方法用于校驗(yàn)一個(gè)具體的對(duì)象是否仍然有效,已失效的對(duì)象會(huì)被自動(dòng)交
*給destroyObject方法銷毀
*/
public boolean validateObject(Object obj) {
/* 以1/2的概率將對(duì)象判定為失效 */
boolean result = (Math.random() > 0.5);
System.err.println("Validating Object "
+ obj + " : " + result);
return result;
}
/* *
*這個(gè)方法用于銷毀被validateObject判定為已失效的對(duì)象。
*/
public void destroyObject(Object obj) throws Exception {
System.err.println("Destroying Object " + obj);
}
}
3.2 使用ObjectPool
ObjectPool是在org.apache.commons.pool包中定義的一個(gè)接口,實(shí)際使用的時(shí)候也需要利用這個(gè)接口的一個(gè)具體實(shí)現(xiàn)。如下:
創(chuàng)建一個(gè)ObjectPoolSample.java類:
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.StackObjectPool;
public class ObjectPoolSample {
public static void main(String[] args) {
Object obj = null;
/*生成PoolableObjectFactory類的實(shí)例*/
PoolableObjectFactory factory = new PoolableObjectFactorySample();
/*生成一個(gè)實(shí)現(xiàn)了ObjectPool接口的類(例如StackObjectPool)的實(shí)例*/
ObjectPool pool = new StackObjectPool(factory);
try {
for(long i = 0; i < 100 ; i++) {
System.out.println("== " + i + " ==");
obj = pool.borrowObject(); //從對(duì)象池中取出對(duì)象
System.out.println(obj);
pool.returnObject(obj); //將對(duì)象放回對(duì)象池
}
obj = null;//明確地設(shè)為null,作為對(duì)象已歸還的標(biāo)志
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try{
if (obj != null) {//避免將一個(gè)對(duì)象歸還兩次
pool.returnObject(obj);
}
pool.close();
}
catch (Exception e){
e.printStackTrace();
}
}
}
}
3.3 利用ObjectPoolFactory
要在多處生成類型和設(shè)置都相同的ObjectPool就要使用ObjectPoolFactory。ObjectPoolFactory是一個(gè)在org.apache.commons.pool中定義的接口,它定義了一個(gè)ObjectPool createPool()方法,可以用于大量生產(chǎn)類型和設(shè)置都相同的ObjectPool。實(shí)例如下:
創(chuàng)建一個(gè)ObjectPoolFactorySample.java文件。
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.ObjectPoolFactory;
import org.apache.commons.pool.PoolableObjectFactory;
import org.apache.commons.pool.impl.StackObjectPoolFactory;
public class ObjectPoolFactorySample {
public static void main(String[] args) {
Object obj = null;
PoolableObjectFactory factory
= new PoolableObjectFactorySample();
ObjectPoolFactory poolFactory
= new StackObjectPoolFactory(factory);
ObjectPool pool = poolFactory.createPool();
try {
for(long i = 0; i < 100 ; i++) {
System.out.println("== " + i + " ==");
obj = pool.borrowObject();
System.out.println(obj);
pool.returnObject(obj);
}
obj = null;
}
catch (Exception e) {
e.printStackTrace();
}
finally {
try{
if (obj != null) {
pool.returnObject(obj);
}
pool.close();
}
catch (Exception e){
e.printStackTrace();
}
}
}
}
4.借助BasePoolableObjectFactory
BasePoolableObjectFactory是org.apache.commons.pool包中的一個(gè)抽象類。它實(shí)現(xiàn)了PoolableObjectFactory接口,并且為makeObject方法提供了一個(gè)基本的實(shí)現(xiàn),而activateObject、passivateObject和destroyObject方法不進(jìn)行任何操作, validateObject始終返回true。通過(guò)繼承這個(gè)類,而不是直接實(shí)現(xiàn)PoolableObjectFactory接口,就可以免去編寫一些只起到讓編譯通過(guò)的作用的代碼的麻煩了。實(shí)例如下:
創(chuàng)建一個(gè)BasePoolableObjectFactorySample.java 文件。
import org.apache.commons.pool.BasePoolableObjectFactory;
public class BasePoolableObjectFactorySample
extends BasePoolableObjectFactory {
private int counter = 0;
public Object makeObject() throws Exception {
return String.valueOf(counter++);
}
}
5. ObjectPool的分類
l StackObjectPool 利用java.util.Stack對(duì)象來(lái)保存對(duì)象池里的對(duì)象。
l SoftReferenceObjectPool 利用java.util.ArrayList對(duì)象來(lái)保存對(duì)象池里的對(duì)象。
l GenericObjectPool利用一個(gè)org.apache.commons.collections.CursorableLinkedList對(duì)象來(lái)保存對(duì)象池里的對(duì)象。
posted on 2008-06-01 14:08
長(zhǎng)春語(yǔ)林科技 閱讀(399)
評(píng)論(0) 編輯 收藏 所屬分類:
util