SessionBean总结

今天刚刚开始学习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浅薄的认识,希望各位高手多多指教。

 

你可能感兴趣的:(session)