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

she*_*aei 78 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的候选者是什么?有什么好例子吗?

会话Bean

tob*_*ler 139

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

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

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

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

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

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

  • "*如果客户消失,豆子也会被毁坏*".实际上,有状态会话bean不会被自动销毁,除非显式调用`@Remove`(`javax.ejb`)修饰的方法(该方法甚至不需要编码.它可以简单地留空/空白,因为它是由@@ Remove`注释.如果关联的客户端忘记销毁有状态会话bean,那么该bean将在服务器上保持悬空状态,直到容器本身决定使用自己的策略将其删除.我错了吗? (15认同)
  • 你当然是对的.有关bean生命周期的更多信息,请访问:http://docs.oracle.com/javaee/6/tutorial/doc/giplj.html (3认同)

BSe*_*zin 44

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