EJB有状态的会话Bean和无状态的会话Bean的区别

更新时间:02-10 教程 由 栗子 分享

EJB有状态的会话Bean和无状态的会话Bean的区别?

在EJB里面,会话Bean分为两种,一种是有状态的会话Bean,另一种是无状态的会话Bean,本节主要讲解一下两者之间的区别。

对于有状态的会话Bean,这种情况属于,服务端与你单独开辟了一块空间与你进行交互。而客户端感觉服务端单独为他自己服务似的。而无状态的会话Bean,则服务端不提供了一个资源但是谁用都行,他不负责。所以客户端在使用的时候,则会感到这个服务 与其他人共享似的。

服务端

分别创建一个有状态的会话bean和一个无状态的会话 Bean。

新建一个EJB项目

新建项目1

新建项目2

然后创建两个接口,两个实现。(分别是有状态和无状态)

有状态会话Bean的接口和实现:

public interface statefulEjb {

public void compute(int i);

public int getResult();

}

@Stateful

@Remote(StatefulEjb.class)

public class StatefulEjbBean implements StatefulEjb {

private int state;

public void compute(int i) {

state += i;

}

public int getResult() {

return state;

}

}

无状态会话Bean的接口和实现:

public interface StatelessEjb {

public void compute(int i);

public int getResult();

}

@Stateless

@Remote(StatelessEjb.class)

public class StatelessEjbBean implements StatelessEjb{

private int state;

public void compute(int i) {

state += i;

}

public int getResult() {

return state;

}

}

创建完之后的结构如下:

服务端接口

之后部署到JBOSS上,(我用的版本是jboss-5.0.1.GA)然后启动JBOSS这样服务端就搭建好了。

客户端

创建一个Java项目,然后添加一个main方法,这个就不详细说了。分别测试有状态的会话Bean和无状态的会话Bean。

1、创建java项目(略)

2、修改环境,需要添加jar包。(jboss安装包里根目录里面client里面的所有jar包)

客户端代码

//测试有状态的会话Bean

public class StatefulEjbClient {

public static void main(String[] args) throws NamingException {

//第一次会话

InitialContext context = new InitialContext();

StatefulEjb ejb1= (StatefulEjb) context.lookup("StatefulEjbBean/remote");

System.out.println(ejb1.getResult());

ejb1.compute(1);

System.out.println(ejb1.getResult());

ejb1.compute(1);

System.out.println(ejb1.getResult());

ejb1.compute(1);

System.out.println(ejb1.getResult());

ejb1.compute(1);

System.out.println(ejb1.getResult());

//第二次会话

StatefulEjb ejb2= (StatefulEjb) context.lookup("StatefulEjbBean/remote");

System.out.println(ejb2.getResult());

ejb2.compute(1);

System.out.println(ejb2.getResult());

ejb2.compute(1);

System.out.println(ejb2.getResult());

ejb2.compute(1);

System.out.println(ejb2.getResult());

ejb2.compute(1);

System.out.println(ejb2.getResult());

}

}

测试结果:

有状态的会话Bean测试结果

//测试无状态的会话Bean

public class StatelessEjbClient {

public static void main(String[] args) throws NamingException {

//第一次会话

InitialContext context = new InitialContext();

StatelessEjb ejb1= (StatelessEjb) context.lookup("StatelessEjbBean/remote");

System.out.println(ejb1.getResult());

ejb1.compute(1);

System.out.println(ejb1.getResult());

ejb1.compute(1);

System.out.println(ejb1.getResult());

ejb1.compute(1);

System.out.println(ejb1.getResult());

ejb1.compute(1);

System.out.println(ejb1.getResult());

//第二次会话

StatelessEjb ejb2= (StatelessEjb) context.lookup("StatelessEjbBean/remote");

System.out.println(ejb2.getResult());

ejb1.compute(1);

System.out.println(ejb2.getResult());

ejb1.compute(1);

System.out.println(ejb2.getResult());

ejb1.compute(1);

System.out.println(ejb2.getResult());

ejb1.compute(1);

System.out.println(ejb2.getResult());

}

}

测试结果:

无状态的会话Bean测试结果

对比上述的两个结果:

有状态的会话Bean,每一个会话 都是一个新的开始。而无状态的会话Bean 每个会话用的时候都会接着用上一次的会话。

有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

声明:关于《EJB有状态的会话Bean和无状态的会话Bean的区别》以上内容仅供参考,若您的权利被侵害,请联系13825271@qq.com
本文网址:http://www.25820.com/tutorial/14_2296378.html