今天刚刚开始学习EJB3.0,学习了几个比较重要的概念,闲来没事,自己总结一下,希望各位高手多多指点下我这个菜鸟。
第一个接触到的概念就是EJB中的SessionBean,下面就来总结一下SessionBean中有状态SessionBean与无状态的
SessionBean的区别以及各自的特点。
有状态的SessionBean:
指的是在服务器端对该种类型的Bean的状态进行了记录,因此在一个会话中调用了有状态的SessionBean时,由于在服务器
端有状态信息进行记录,因此对调用的SessionBean对象是确定的。以下面的实例进行说明:
//调用有状态SessionBean的客户端 public class StatefulEbjClient { public static void main(String[] args) { try { InitialContext context = new InitialContext(); //启动一个Session会话,创建一个StatefulEjb类型的实例 StatefulEjb fe = (StatefulEjb)context.lookup("StatefulEjbBean/remote"); for(int i = 0 ; i < 5 ; i++){ /*add()和getResult()是在StatefulEjb接口中随便定义的两个方法*/ fe.add(1);//每次调用该方法就对变量+1 System.out.println(fe.getResult());//将变量的值输出 } System.out.println("*******************************"); //第二个session StatefulEjb fe2 = (StatefulEjb)context.lookup("StatefulEjbBean/remote"); for(int i = 0 ; i < 5 ; i++){ fe2.add(1); System.out.println(fe2.getResult()); } } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
有状态的SessionBean的特点是每次调用该main方法时,都会重新创建一个fe对象,而且,调用add和getResult这两个
方法的fe都是同一个对象,不论执行多少次或者在多少个Session会话范围内执行,所得的结果都是一样的。
所以,上面程序的运行结果不论执行多少次都是:
1
2
3
4
5
*********************************
1
2
3
4
5
无状态的SessionBean:
与有状态的SessionBean刚好相反,服务器端不会记录该Bean的状态信息,因此每次调用无状态的SessionBean的实例
都是无法确定的。以下面的实例说明:
public class StatelessEbjClient { public static void main(String[] args) { try { InitialContext context = new InitialContext(); //第一个session StatelessEjb slsb = (StatelessEjb)context.lookup("StatelessEjbBean/remote"); for(int i = 0 ; i < 5 ; i++){ slsb.add(1); System.out.println(slsb.getResult()); } System.out.println("***********************"); //第二个session StatelessEjb slsb2 = (StatelessEjb)context.lookup("StatelessEjbBean/remote"); for(int i = 0 ; i < 5 ; i++){ slsb2.add(1); System.out.println(slsb2.getResult()); } } catch (NamingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
这段程序的逻辑与上一段完全相同,唯一的区别就是在两个Session会话中分别生成了两个StatelessEjb的实例,
得到的结果如下所示:
第一次运行的结果:
1
2
3
4
5
*********************************
6
7
8
9
10
从第一次运行的结果可以看出,无状态的SessionBean类似一种单例模式。
第二次运行的结果:
11
12
13
14
15
***********************
16
17
0
0
0
第二次的运行结果就充分说明:无状态的SessionBean在被调用时,并不能确定调用的是哪个实例。
说明:这个结果只是某次运行的结果,无状态的SessionBean在每次运行时的结果都是不确定的,而有状态的
SessionBean刚好相反,每次运行的结果都是可以预先确定的。
以上便是本人一点点对两种SessionBean浅薄的认识,希望各位高手多多指教。