有状态的EJB对象和无状态的EJB对象
程序员文章站
2024-02-22 22:09:34
...
一,定义有状态Bean和无状态Bean
有状态Bean:
@Stateful
@Remote
public class StatefulEjbBean implements StatefulEjb{
private int state;
@Override
public void compute(int i) {
state=state+i;
}
@Override
public int getResult() {
return state;
}
}
无状态Bean:
@Stateless
@Remote
public class StatelessEjbBean implements StatelessEjb {
private int state;
@Override
public void compute(int i) {
state = state + i;
}
@Override
public int getResult() {
return state;
}
}
二,客户端测试及结果
1,测试有状态EJB对象:
public class StatefulEjbClient {
public static void main(String[] args) throws Exception {
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());
ejb1.compute(1);
System.out.println(ejb1.getResult());
System.out.println("第一次会话结束---------");
//第二次会话
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());
ejb2.compute(1);
System.out.println(ejb2.getResult());
System.out.println("第二次会话结束---------");
}
}
结果:
2,测试无状态EJB对象:
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());
ejb1.compute(1);
System.out.println(ejb1.getResult());
System.out.println("第一次会话结束---------");
//第二次会话
StatelessEjb ejb2=(StatelessEjb)context.lookup("StatelessEjbBean/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());
ejb2.compute(1);
System.out.println(ejb2.getResult());
System.out.println("第二次会话结束---------");
//判断每次查找到的对象是否一样
System.out.println(ejb1==ejb2);//false
}
}
结果:
三,结果对比
通过多次执行,发现对于有状态的EJB对象,每次通过查找获得的对象都是新对象;而对于无状态的EJB对象,每次查找获得的对象都有一个单例类的效果,多次执行测试无状态的EJB对象的方法,会发现服务端的貌似始终在对一个对象进行操作。
上一篇: Tomcat服务无法启动的问题的解决方法
下一篇: ejb中的EntityBean例子