如何池化您的对象
作者:older 日期:2008-09-04 19:57:54
| pool.jar(26.5 K) | |
对象池技术基本原理的核心有两点:缓存和共享,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序重复使用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。事实上,由于对象池技术将对象限制在一定的数量,也有效地减少了应用程序内存上的开销。
在上一篇日记中,我们以图书管类比的方式介绍了对象池的一些主要业务特点,这一节中我们推荐介绍一个池化工具。 使用过EJB的人都知道,EJB容器提供了无状态Session Bean与有状态Session Bean,它们可以主要用来响应来自客户端 调用请求.EJB的调用有可能是并发的,这意味同一时间容器要接受多个调用请求,EJB服务器是有能力为这些请求分配 Bean的施例来满足调用。我们可以假定一次调用:当EJB Server接收到一次调用,它会立刻从“相应容器”中获取一个 Bean实例来完成当前的调用,完毕后,这个“相应容器”则会回收这个刚分配出去的Bean实例,以等待下次调用的分配。 上面提到的“相应容器”其实就是一个池化容器。池化容器可以管理对象的生命周期。生命周期?好专业词语,呵呵, 直白一点,无非是控制对象的生生死死。下面介绍我一下我们所提供的一个池化工具:Jmin Pool,该工具使用非常简单 ,包学包会。
1:接口介绍
为了大致了解该工具的使用,将介绍一些基本的类与接口。既然是池化,自然需要提到池化容器,在该工具包中定义了一个基本的容器类:Pool,如下:
1 | package org.jmin.j2ee.pool;
public abstract class Pool {
public abstract Object borrowInstance(Object identity);
public abstract void returnInstance(Object instance);
..................
}
|
在pool类中提供了两个方法,用来供外部获取被池化的对象实例和回收外部使用完毕的对象实例,对象回到池中,等待 下一次分配。这两个方法体现了两个字:一个“借”? 与一个”还“,原理类似图书管吧。从对象角度来说,对象池也 是对象,既然是对象,那么它实例就需要创建。在工具包中提供一个池化容器的管理者:PoolTable,它负责池化容器的 创建。在实际应用中,一个PooTable对象是可以管理多个Pool,那么如何区分这些Pool呢?给它们名字,每一个Pool 都应该有一个唯一的名字,方便PoolTable的管理。由于池化容器存在有无状态之分,因此PoolTable存在两个子类的实 现:StatelessPoolTable 与StatefulPoolTable,它们分别可以创建无状态容器与有状态容器。下面给出这个超类 PoolTable的部分代码。
1 | package org.jmin.j2ee.pool;
public abstract class PoolTable{
public abstract Pool createPool(Object poolID,PoolDefinition desc);
..................
}
|
当前创建一个Pool时,除了给出目标Pool的名字外,还需要给出Pool其他属性的定义,如:池的大小,对象实例的构造方式,在该工具包中已经存在一个描述性对象类:PoolDefinition,在创建Pool之前,是应该准备好一个pool的定义。对于PoolDefinition,可以指定两种池化对象的构造方式,
A:通过类的直接构造,直接提交一个Class给PoolDefinition即可?如:
1 | ? PoolDefinition definition = new PoolDefinition(xxxx.class); |
需要提醒一点:对于xxxx.class必须存在一个无参的构造函数。
B:通过对象工厂间接创建对象实例,但是需要编写自己的工厂类来扩展接口:InstanceFactory,
1 | package org.jmin.j2ee.pool;
public interface InstanceFactory {
/**
* Create a object instance
*/
public Object create()throws Exception;
/**
* Destory object
*/
public void destroy(Object obj)throws Exception;
}
|
这时只需要提交一个InstanceFactory一个实现类对象就可以了,如下例子:
1 | public class MyObjectFactory implements InstanceFactory {
public Object create()throws Exception{
return new Object();
}
public void destroy(Object obj)throws Exception{}
}
|
对于definition 就可以通过如下方式构造:
1 | PoolDefinition definition = new PoolDefinition(new MyObjectFactory()); |
2:例子说明
上面给出了一些工具包的基本类介绍,为了加深理解,下面将依据步骤给出一个无状态池应用例子.
第一步:定义被池化的目标类:
1 | public class Bean{}
|
为了简便起见,定义一个最简单的类,我们将通过池化容器获取该类的实例。
第二步:创建管理Pool的PoolTable对象
1 | PoolTable table =PoolTableFactory.createStatelessPoolTable(); |
第三步:创建池的定义对象
1 | PoolDefinition definition = new PoolDefinition(Bean.class); definition.setMaxSize(10); |
第四步:创建池化容器:
1 | Pool pool = table.createPool("Bean", definition);
|
第五步应用池获取对象实例:
循环5000次,获取对象,使用并归还。
1 | for(int i=0;i<500;i++){
//获取对象,由于是无状态,所以给null参数
Object instance = pool.borrowInstance(null);
//以打印模拟使用对象
System.out.println(instance);
//使用完毕,归还对象到池冲。
pool.returnInstance(instance);
}
|
总结,经过上面五步动作,已经完成了一个无状态的应用,从第二步到第五步可以用一个测试包括如下:
1 | import org.jmin.j2ee.pool.Pool;
import org.jmin.j2ee.pool.PoolTable;
import org.jmin.j2ee.pool.PoolDefinition;
import org.jmin.j2ee.pool.PoolTableFactory;
public class TestPool{
public static void main(String[] args){
PoolTable table = PoolTableFactory.createStatelessPoolTable();
PoolDefinition definition = new PoolDefinition(Bean.class);
definition.setMaxSize(10);
Pool pool = table.createPool("Bean", definition);
for(int i=0;i<500;i++){
Object instance = pool.borrowInstance(null);
System.out.println(instance);
pool.returnInstance(instance);
}
}
|
其实该工具提供的池化还不止这些,这个只最简单一个例子。
欢迎下载使用。
附:工具包已经作为该文的附件,请在文件头处下载
平均得分
(0 次评分)
评论: 1 | 查看次数: 1322
- 共有 1 条评论
- 共有 1 条评论
发表评论
订阅
上一篇
|

文章来自:
标签: 





Lord of the Rings Online Gold
Buy Lotro Gold
Sell LoTRO Gold
LoTRO CD Key
LoTRO Europe Gold
Cheap LoTRO Accounts
Lord of the Rings Online Power Leveling
Lord of the Rings online CD Key
Cheap Lotro Gold
Buy Lotro Gold | Lord Of The Rings Online Gold
Lotro Accounts
| Buy Lotro Accounts
Lord Of The Rings Online Power Leveling | Lord Of The Rings Online PowerLeveling
Lotro Cd Key | Lord Time Card
Lotro Gold | Lotro Gold Instant Delivery
lord of the rings online accounts | lord of the rings online accounts for sale
Lotro Power Leveling | Lotro Powerleveling
Lord Of The Rings Online Cd Key | Lord Of The Rings Online Time Card