什么时候使用有状态会话bean

首先你应该清楚Session bean在服务器上是怎么样被创建以及管理的。

拿无状态会话bean来说服务器在实例池中维护了它的很多实例。每次客户端请求的时候任意一个无状态的会话bean都可能会被选择出来,来对这个请求作出相应的处理。也就是说如果客户端发起两次请求那么很有可能会是两个不同的无状态会话bean实例来做处理。实际上在这两个无状态会话bean之间没有什么联系。同样的如果客户端消失那么无状态会话bean不会被销毁,因为其还要对下一个请求进行处理。

另一方面对于有状态会话bean来说,它与客户端的联系更加紧密一些。每个实例被创建之后都将与一个对应的客户端绑定并服务于这个特定的客户端。也就是说如果你对于一个有状态会话bean发出多个请求,那么只会有一个这个bean的实例来处理你的多个请求。这样的话你可以管理在多个请求过程中需要保留的状态信息。相应的如果客户端消失那么这个bean的实例也将会被销毁。

l  保存客户端状态

有状态会话bean是在一个会话中多次请求会话bean的时候用来管理客户端状态的。如果你研究过JbossSeam框架你会发现这个框架在上下文的会话中大量使用了有状态会话bean

EJB3中没有说无状态就一定比有状态会话bean好。比如一个提供信用卡处理的服务用无状态会话bean就好一些,一个提供多个信用卡服务的服务用有状态会话bean就好一些。这很大程度上取决于你是否想维护会话的状态。再比如你有一个方法是关于数字相加并且得到返回结果的,这时你应该用无状态会话bean,因为数字相加是一次性的行为,你可以再次调用这个方法而不关心上次的计算结果。但是如果你希望对所有的结果做一个统计,那么你应该用有状态会话bean。因为在第二个场景中知道以往的处理结果成为核心业务,所以你不得不维护整个会话的状态,推荐的做法是在有状态会话bean中用一个变量将这个值储存起来。如果你在这里错误的使用了无状态会话bean,那么客户端的请求在被处理得时候会被不同的会话bean实例处理,那么将导致结果不是预期的那样。

l  线程安全+灵活+事务

HttpSession和无状态会话bean都可以管理客户端的状态,但是如果你使用HTTPSession对象那么你必须担心线程安全问题。因为HTTPSession不是线程安全的。如果你使用有状态会话bean那么你就不必担心这个问题。因为有状态会话bean在各个客户端之间不是共享的。

也许很多人不认为线程安全对于使用HTTPSession是一个大问题。如果业务逻辑在servlet而不是在EJB中处理的应用程序线程问题应该容易被解决。但是HTTPSession是有关HTTP的,就像上面说的它可以用在展现层,而不是业务层。因为业务层可能用非HTTP的客户端,比如桌面应用程序或者基于Web Services的应用程序。

还有一点就是如果将来你的前端改变了,那么你将不得不去再次在你新的前端框架中维护HTTPSession,如果你用的是有状态会话bean那么你将不用考虑这个问题。

如果在你的程序中有事务的话和HTTPSession相比你最好使用有状态会话bean。简而言之HTTPSession是在展现层使用的而不应该在逻辑层使用,而有状态会话bean就不同,在可以保存客户端状态的基础上其还能兼顾事务的处理。因为EJB容器中对于事务默认的规则是在业务方法的开始与结束处标记事务的边界,对于EJB3中有状态会话bean来说最大的优点之一就是他延伸了持久层的上下文。你可以在同一个会话中甚至在不同的页面做CRUD操作,直到最后提交或回滚。


(夫鸡肋,弃之如可惜,食之无所得,以比汉中,知王欲还也。----《三国志·魏书·武帝纪》)

说了这么多回到文章题目的问题,“什么时候使用有状态会话bean”答案是当你需要用的时候,当你确定自己需要保存客户端状态的时候,当你考虑事务,考虑灵活性使用HTTPSession不能解决问题的时候,当你可以接受有状态会话bean的性能的时候。那么就要考虑使用有状态会话bean了。,最后笔者对大家的忠告是有状态会话bean看上去很美但是使用需小心谨慎。在《Ejb3 in action》中提供了很多有状态会话bean的替代解决方案Page107Stateful session bean alternatives”,有兴趣的读者可以参考一哈。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值