您的位置:首页 > 其它

EJB学习笔记三(有状态和无状态SessionBean的区别)

2015-07-28 16:22 232 查看
 

 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
客户端与服务端之间的会话比较多。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: