有状态会话bean的定义如下:
有状态会话Bean对象的状态由值组成 其实例变量。在有状态会话bean中,实例 变量表示唯一的客户端bean会话的状态。因为 客户端与其bean交互(“会话”),这种状态通常是 称为会话状态。
无状态会话bean的定义如下:
无状态会话Bean无状态会话Bean不维护 与客户的会话状态。当客户端调用 无状态bean的方法,bean的实例变量可能包含 特定于该客户的状态,但仅限于该客户的持续时间 调用。方法完成后,客户端特定的状态 不应保留。但是,客户可能会改变状态 池化无状态bean中的实例变量,并保持此状态 到下一次调用池化无状态bean。除了 在方法调用期间,无状态bean的所有实例都是 等效,允许EJB容器为任何实例分配实例 客户。也就是说,应该应用无状态会话bean的状态 所有客户都有。
使用无状态会话bean而不是有状态会话bean的优点如下:
因为无状态会话bean可以支持多个客户端,所以它们可以 为需要大量数据的应用程序提供更好的可扩展性 客户。通常,应用程序需要较少的无状态会话 bean比有状态会话bean支持相同的数量 客户端。
所以我想到的问题是,何时应该使用有状态会话bean?为了我对这个问题的天真理解,我应该坚持使用无状态会话bean。
应该使用有状态会话bean的候选者是什么?有什么好例子吗?
答案 0 :(得分:134)
首先,您必须了解如何在服务器上创建和处理bean。
对于无状态会话bean ,服务器可以在池中维护可变数量的实例。每次客户端请求这样的无状态bean(例如通过方法)时,选择随机实例来提供该请求。这意味着如果客户端执行两个后续请求,则无状态bean的两个不同实例可能会为请求提供服务。事实上,两个请求之间没有会话状态。此外,如果客户端消失,则无状态bean不会被销毁,并且可以提供来自另一个客户端的下一个请求。
另一方面,有状态会话bean 与客户端紧密相连。每个实例都创建并绑定到单个客户端,并仅提供来自该特定客户端的请求。碰巧,如果你对有状态bean做两个后续请求,你的请求将始终从bean的同一个实例提供。这意味着您可以在请求之间保持对话状态。在生命周期结束时,客户端调用remove方法,bean被销毁/准备好进行垃圾收集。
何时使用无国籍或有状态?
这主要取决于您是否要保持会话状态。例如,如果您有一个方法可以将两个数字相加并返回结果,则使用无状态bean,因为它是一次性操作。如果您第二次使用其他数字调用此方法,则不再对之前添加的结果感兴趣。
但是,如果您想要,例如,计算客户端已完成的请求数,则必须使用有状态bean。在这种情况下,了解客户端之前请求bean方法的频率非常重要,因此您必须在bean中维护会话状态(例如,使用变量)。如果你在这里使用无状态bean,那么客户端的请求每次都会从不同的bean中提供,这会影响你的结果。
答案 1 :(得分:40)
我认为使用有状态会话bean 的最佳示例是购物车,您可以在其中存储用户想要购买的所有产品。