87

有状态会话 bean 定义如下:

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

无状态会话 bean 定义如下:

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

使用无状态会话 bean 优于有状态会话 bean 的优点如下:

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

所以想到的问题是什么时候应该使用有状态会话bean?根据我对此事的天真理解,应该尽可能坚持使用无状态会话 bean。

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

会话 Bean

4

2 回答 2

159

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

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

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

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

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

但是,例如,如果您想计算客户端完成的请求数,则必须使用有状态 bean。在这种情况下,重要的是要知道客户端之前请求 bean 方法的频率,因此您必须在 bean 中维护会话状态(例如,使用变量)。如果您在此处使用无状态 bean,则每次都会从不同的 bean 为客户端的请求提供服务,这会弄乱您的结果。

于 2013-09-20T12:47:08.687 回答
56

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

于 2014-06-24T05:13:47.227 回答