【EJB基础】session bean

EJBsession bean分为有状态会话Bean和无状态会话Bean,下面看看这两个有什么区别。

 

有状态会话Bean

能够区分不同的客户端,并分为为不同的客户端保持与其对应的状态信息。即从某个客户端角度来看,似乎EJB对象正被它独占了一样,不会因为有任何其它的客户端同时对同一个EJB访问而影响其它最终的计算结果。

 

举例:两个不同用户往购物车加入商品。

@Stateful
@Remote
public classStatefulEjbBean implements StatefulEjb{
 
privateint state;
publicvoid addCart(int i) {
state=state+i;        
}
 
//把产品加入购物车
publicString getProduct() {
return "把"+String.valueOf(state)+"加入购物车";
}
 
}

客户端代码调用:

/**    
 * 功能: 有状态会话Bean客户端调用 
 * 作者: 宋笑 
 * 日期: 2016-3-1 上午10:19:12  
 *     
 */
public classStatefulEjbClient {
 
publicstatic void main(String[] args)throws Exception{
InitialContextctx=new InitialContext();
 
//第一次会话
StatefulEjbejb1=(StatefulEjb)ctx.lookup("StatefulEjbBean/remote");
//打印产品
System.out.println(ejb1.getProduct());
for(int i = 0; i < 10; i++) {
ejb1.addCart(1);
System.out.println(ejb1.getProduct());
}
System.out.println("---------第一次会话结束--------");
 
//第二次会话
StatefulEjbejb2=(StatefulEjb)ctx.lookup("StatefulEjbBean/remote");
//打印产品
System.out.println(ejb2.getProduct());
for(int i = 0; i < 10; i++) {
ejb2.addCart(1);
System.out.println(ejb2.getProduct());
}
System.out.println("---------第二次会话结束--------");
}
}

测试结果:


每一个会话相当于一个用户,两个用户调用同一个EJB对象,不会相互影响。两个用户都有自己单独的购物车。

 

无状态会话Bean

EJB容器不会对EJB的状态做管理,容器会使用实例池的方式,甚至单利的方式来实现无状态的Session Bean。不能够区分不同的客户端,各个用户会共享同一个Bean

 

举例:两个不同用户往购物车加入商品。

@Stateless
@Remote
public classStatelessEjbBean implements StatelessEjb {
 
privateint state;
publicvoid addCart(int i) {
state=state+i;        
}
 
//加入的购物车产品
publicString getProduct() {
return "把"+String.valueOf(state)+"加入购物车";
}
 
}

客户端代码调用:

/**    
 * 功能: 无状态会话Bean客户端调用 
 * 作者: 宋笑 
 * 日期: 2016-3-1 上午10:19:29  
 *     
 */
public classStatelessEjbClent {
publicstatic void main(String[] args)throws Exception{
InitialContextctx=new InitialContext();
 
//第一次会话
StatelessEjbejb1=(StatelessEjb)ctx.lookup("StatelessEjbBean/remote");
//打印产品
System.out.println(ejb1.getProduct());
for(int j = 0; j < 6; j++) {
ejb1.addCart(1);
System.out.println(ejb1.getProduct());
}
System.out.println("---------第一次会话结束--------");
 
//第二次会话
StatelessEjbejb2=(StatelessEjb)ctx.lookup("StatelessEjbBean/remote");
//打印产品
System.out.println(ejb2.getProduct());
for(int j = 0; j < 6; j++) {
ejb2.addCart(1);
System.out.println(ejb2.getProduct());
}
System.out.println("---------第二次会话结束--------");
 
}

测试结果:


两个用户调用同一个EJB对象,共享同一个EJB对象。就好像共用一个购物车一样。

 

有状态的会话Bean,每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

无状态会话Bean,bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值