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 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。