【EJB学习笔记】——有状态的会话Bean和无状态的会话Bean


  EJB中的会话Bean(Session Bean)分为有状态的(Stateful)会话Bean和无状态的(Stateless)会话Bean。

  对象的状态是由其实例变量(即成员变量)的值组成的

  有状态的会话Bean:每次访问都会为用户分配一个独立的bean,在用户的生存周期内,bean始终为当前用户保存信息(用户的状态),用户访问结束时,bean的生存周期也随之结束。有状态会话Bean定义的方式是在类头使用注解@Stateful。

  无状态的会话Bean:bean的成员变量保存的信息是所有客户端共享的,不是专门为单独的客户端而保留的。无状态会话Bean定义的方式是在垒头使用注解@Stateless。


举例说明

  有状态的会话Bean例子

  接口

public interface StatefulEjb {
public void compute(int i);
public int 	getResult();
}

  EJB实现类

@Stateful
@Remote
public class StatefulEjbImpl implements StatefulEjb {
	private int state;
	public void compute(int i) {
		state=state+i;
	}
	public int getResult() {
		return state;
	}
}

  客户端调用

public class StatefulEjbClient{
	public static void main(String[] args) throws Exception {
		
		InitialContext context=new InitialContext();
		StatefulEjb statefulEjb1=(StatefulEjb)context.lookup("StatefulEjbImpl/remote");			
		for(int i=0;i<10;i++){
			statefulEjb1.compute(1);
			System.out.println("statefulEjb1:"+statefulEjb1.getResult());
		}	
			
		StatefulEjb statefulEjb2=(StatefulEjb)context.lookup("StatefulEjbImpl/remote");			
		for(int i=0;i<5;i++){
			statefulEjb2.compute(1);
				System.out.println("statefulEjb2:"+statefulEjb2.getResult());
		}
	}	
}

  执行结果

statefulEjb1:1
statefulEjb1:2
statefulEjb1:3
statefulEjb1:4
statefulEjb1:5
statefulEjb2:1
statefulEjb2:2
statefulEjb2:3
statefulEjb2:4
statefulEjb2:5

  由执行结果可以发现,客户端的两个实例分别调用服务端的有状态会话Bean,每次执行时,客户端都“独享”一个EJB实例,每次调用与其他调用之间的数据并不桐乡,互相独立,互不冲突。


  **无状态的会话Bean例子**

  接口

public interface StatelessEjb {
public void compute(int i);
public int 	getResult();
}

  EJB实现类

@Stateless
@Remote
public class StatelessEjbImpl implements StatelessEjb{
	private int state;
	public void compute(int i) {
		state=state+i;
	}

	public int getResult() {
		return state;
	}
}

  客户端调用

public class StatelessEjbClient{
	public static void main(String[] args) throws Exception {
		InitialContext context=new InitialContext();
		StatelessEjb statelessEjb1=(StatelessEjb)context.lookup("StatelessEjbImpl/remote");			
		for(int i=0;i<10;i++){
			statelessEjb1.compute(1);
				System.out.println("statefulEjb1:"+statelessEjb1.getResult());
		}		
		StatelessEjb statelessEjb2=(StatelessEjb)context.lookup("StatelessEjbImpl/remote");			
		for(int i=0;i<10;i++){
			statelessEjb2.compute(1);
			System.out.println("statefulEjb2:"+statelessEjb2.getResult());
		}
		System.out.println(statelessEjb1==statelessEjb2);
	}	
}

  执行结果

statefulEjb1:1
statefulEjb1:2
statefulEjb1:3
statefulEjb1:4
statefulEjb1:5
statefulEjb2:6
statefulEjb2:7
statefulEjb2:8
statefulEjb2:9
statefulEjb2:10
false

  由执行结果可以发现,客户端第一个实例statelessEjb1调用时,调用了5次,state的值增加到5;第二个实例statelessEjb2调用时,调用了5次,state的值从5开始增加,一直增加到10。由此可见,这两个实例调用无状态的会话Bean时,这10次调用的其实是一个EJB实例,实例的成员变量也是共享的。


总结

  综上所述,有状态会话Bean可以保存用户状态,但每个用户访问都会实例化一次,会大大降低系统;无状态会话Bean可以被无限复用,性能比较高,但却不能保证保存每个用户的状态。各有利弊。


【 转载请注明出处——胡玉洋《EJB——有状态的会话Bean和无状态的会话Bean》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值