何时在无状态会话bean上使用有状态会话bean?

时间:2013-08-01 17:13:04

标签: java spring ejb stateless-session-bean stateful-session-bean

有状态会话bean的定义如下:

  

有状态会话Bean对象的状态由值组成   其实例变量。在有状态会话bean中,实例   变量表示唯一的客户端bean会话的状态。因为   客户端与其bean交互(“会话”),这种状态通常是   称为会话状态。

无状态会话bean的定义如下:

  

无状态会话Bean无状态会话Bean不维护   与客户的会话状态。当客户端调用   无状态bean的方法,bean的实例变量可能包含   特定于该客户的状态,但仅限于该客户的持续时间   调用。方法完成后,客户端特定的状态   不应保留。但是,客户可能会改变状态   池化无状态bean中的实例变量,并保持此状态   到下一次调用池化无状态bean。除了   在方法调用期间,无状态bean的所有实例都是   等效,允许EJB容器为任何实例分配实例   客户。也就是说,应该应用无状态会话bean的状态   所有客户都有。

使用无状态会话bean而不是有状态会话bean的优点如下:

  

因为无状态会话bean可以支持多个客户端,所以它们可以   为需要大量数据的应用程序提供更好的可扩展性   客户。通常,应用程序需要较少的无状态会话   bean比有状态会话bean支持相同的数量   客户端。

所以我想到的问题是,何时应该使用有状态会话bean?为了我对这个问题的天真理解,我应该坚持使用无状态会话bean。

应该使用有状态会话bean的候选者是什么?有什么好例子吗?

Session Bean

2 个答案:

答案 0 :(得分:134)

首先,您必须了解如何在服务器上创建和处理bean。

对于无状态会话bean ,服务器可以在池中维护可变数量的实例。每次客户端请求这样的无状态bean(例如通过方法)时,选择随机实例来提供该请求。这意味着如果客户端执行两个后续请求,则无状态bean的两个不同实例可能会为请求提供服务。事实上,两个请求之间没有会话状态。此外,如果客户端消失,则无状态bean不会被销毁,并且可以提供来自另一个客户端的下一个请求。

另一方面,有状态会话bean 与客户端紧密相连。每个实例都创建并绑定到单个客户端,并仅提供来自该特定客户端的请求。碰巧,如果你对有状态bean做两个后续请求,你的请求将始终从bean的同一个实例提供。这意味着您可以在请求之间保持对话状态。在生命周期结束时,客户端调用remove方法,bean被销毁/准备好进行垃圾收集。

  

何时使用无国籍或有状态?

这主要取决于您是否要保持会话状态。例如,如果您有一个方法可以将两个数字相加并返回结果,则使用无状态bean,因为它是一次性操作。如果您第二次使用其他数字调用此方法,则不再对之前添加的结果感兴趣。

但是,如果您想要,例如,计算客户端已完成的请求数,则必须使用有状态bean。在这种情况下,了解客户端之前请求bean方法的频率非常重要,因此您必须在bean中维护会话状态(例如,使用变量)。如果你在这里使用无状态bean,那么客户端的请求每次都会从不同的bean中提供,这会影响你的结果。

答案 1 :(得分:40)

我认为使用有状态会话bean 的最佳示例是购物车,您可以在其中存储用户想要购买的所有产品。