何时使用无状态会话bean的状态会话bean?

有状态会话bean定义如下:

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

无状态会话bean定义如下:

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

还提到无状态会话bean的优点如下:

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

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

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

会话Bean

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

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

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

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

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

但是,如果您想要计算客户端完成的请求数,则必须使用有状态bean。 在这种情况下,知道客户之前请求bean方法的频率是非常重要的,所以你必须保持bean中的会话状态(例如用一个variables)。 如果你在这里使用一个无状态的bean,那么客户端的请求将会每次从不同的bean中被调用,从而导致你的结果混乱。

我认为使用有状态会话bean的最好例子是购物车 ,在那里你存储所有用户想要购买的产品。