1.前言
在EJB概述的博客中也曾提到过EJB3.0中的SessionBean的两种状态,下面呢,通过本篇博客深入的分析一下,两种状态的SessionBean到底有何区别。
2.开发一个有状态的SessionBean
2.1、接口
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package com.test; public interface StateFulEjbBean { public void compute(int i); public int getResult(); } </span></span>
2.2、实现类
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package com.test; import javax.ejb.Remote; import javax.ejb.Stateful; //有状态的SessionBean实现类 @Stateful //远程访问接口 @Remote public class StateFulEjbBeanImp implements StateFulEjbBean { private int state; public void compute(int i) { state=state+i; } public int getResult() { return state; } } </span></span>
3.开发一个无状态的SessionBean
有状态和无状态SessionBean,在定义上,只不过是注解形式不一样而已,有状态的注解关键字是StateFul,无状态是StateLess
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package com.test; import javax.ejb.Remote; import javax.ejb.Stateless; @Stateless @Remote public class StateLessEjbBeanImpl implements StateLessEjbBean{ private int state; public void compute(int i) { state=state+i; } public int getResult() { return state; } } </span></span>
4.简单测试
4.1、有状态客户端编写
下面通过一个客户端来分别调用一下,上述Demo中的有状态和无状态的SessionBean,调用方法和上一篇博客类似,就不再详细的介绍。
<span style="font-family:SimSun;font-size:18px;"><span style="font-family:SimSun;font-size:18px;">package com.test; import javax.naming.InitialContext; import javax.naming.NamingException; public class StatefulEjbClient { public static void main(String[] args) throws NamingException { //如果不配置JNDI的话,需要在代码中书写如下 // Properties props=new Properties(); // 第一次会话 InitialContext context = new InitialContext(); StateFulEjbBean ejb1 = (StateFulEjbBean) context .lookup("StateFulEjbBeanImp/remote"); System.out.println(ejb1.getResult()); ejb1.compute(1); System.out.println(ejb1.getResult()); //第二次会话,新的对象,新的会话,因为是有状态的,所以会创建新的对象,变量不是单例的 StateFulEjbBean ejb2 = (StateFulEjbBean) context .lookup("StateFulEjbBeanImp/remote"); System.out.println(ejb2.getResult()); ejb2.compute(1); System.out.println(ejb2.getResult()); ejb2.compute(1); } } </span></span>
4.2、测试有状态SessionBean
当把EJB部署到JBoss中,测试上述实例的时候,无论测试几次,结果都如下所示
4.3、测试无状态SessionBean
当把EJB项目部署到JBoss中,测试上述实例的时候,每次运行的结果不一样,有一个累加的过程,如下图
4.4.两种状态的区别
1.关键字上一个是StateFul。另一个是StateLess
2.无状态的SessionBean有以下好处
EJB容器无须为每个客户端分配一个EJB实例(对于有状态的Session Bean而言,系统必须为每个客户端分配一个EJB实例),可以减少创建、维护EJB实例的系统开销
EJB容器无须维护EJB的内部状态,系统开销大大降低。
3.有状态的SessionBean使用场景
客户端数量比较有限 ,当客户端数量巨大时,那就意味着EJB容器要同时为何大量有状态的EJB,这将导致EJB容器的性能直线下降。因此,只有当客户端数量比较固定时,才可以考虑使用有状态的SessionBean
客户端与服务端之间的会话比较多。