订阅所有JSP/Servlet的日志 订阅 | 这是最新一篇日志 上一篇 | 下一篇日志 下一篇 ]
java

如何池化您的对象

附件
pool.jar(26.5 K)
 
切换到幻灯片模式

对象池技术基本原理的核心有两点:缓存和共享,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序重复使用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。事实上,由于对象池技术将对象限制在一定的数量,也有效地减少了应用程序内存上的开销。

在上一篇日记中,我们以图书管类比的方式介绍了对象池的一些主要业务特点,这一节中我们推荐介绍一个池化工具。 使用过EJB的人都知道,EJB容器提供了无状态Session Bean与有状态Session Bean,它们可以主要用来响应来自客户端 调用请求.EJB的调用有可能是并发的,这意味同一时间容器要接受多个调用请求,EJB服务器是有能力为这些请求分配 Bean的施例来满足调用。我们可以假定一次调用:当EJB Server接收到一次调用,它会立刻从“相应容器”中获取一个 Bean实例来完成当前的调用,完毕后,这个“相应容器”则会回收这个刚分配出去的Bean实例,以等待下次调用的分配。 上面提到的“相应容器”其实就是一个池化容器。池化容器可以管理对象的生命周期。生命周期?好专业词语,呵呵, 直白一点,无非是控制对象的生生死死。下面介绍我一下我们所提供的一个池化工具:Jmin Pool,该工具使用非常简单 ,包学包会。
1:接口介绍
为了大致了解该工具的使用,将介绍一些基本的类与接口。既然是池化,自然需要提到池化容器,在该工具包中定义了一个基本的容器类:Pool,如下:
1
2
3
4
5
6
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
2
3
4
5
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
2
3
4
5
6
7
8
9
10
11
12
13
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
2
3
4
5
6
7
8
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
2
PoolDefinition definition = new PoolDefinition(Bean.class);
definition.setMaxSize(10);


第四步:创建池化容器:
1
Pool pool = table.createPool("Bean", definition);

第五步应用池获取对象实例:
循环5000次,获取对象,使用并归还。
1
2
3
4
5
6
7
8
9
10
11
for(int i=0;i<500;i++){
 
  //获取对象,由于是无状态,所以给null参数 
 Object instance = pool.borrowInstance(null);
 
  //以打印模拟使用对象
 System.out.println(instance);
 
  //使用完毕,归还对象到池冲。
 pool.returnInstance(instance);
 }


总结,经过上面五步动作,已经完成了一个无状态的应用,从第二步到第五步可以用一个测试包括如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 次评分)





文章来自: 本站原创
标签: java 对象池 缓存和共享 
评论: 1 | 查看次数: 365
  • 共有 1 条评论
  • 共有 1 条评论
发表评论
昵 称:  登录
内 容:
选 项:
字数限制 1000 字 | UBB代码 开启 | [img]标签 开启