2011-03-01 125 views
8

我对Java EE 6的读一本书,我会见了以下几个部分:会话状态

“无状态:会话bean包含方法之间没有会话状态,任何 实例可以用于任何客户端。“

“有状态:会话Bean包含会话状态,必须跨单个用户的方法保留 。”

什么是 “会话状态” 是什么意思?有人用真实世界的例子来解释它吗?

在此先感谢。

二,为什么豆类的分类如此重要?它无论是对于初学者还是对初学者都没有提供正确的解释 非常感谢你,我得到了逻辑上的区别,但是为什么这种行为如此重要?

回答

11

最基本的,“会话状态”是指实例字段的值。

对于无状态会话bean,容器并不能保证以后的方法调用将使用相同的EJB实例(从池),因此你不能想当然地认为,当你调用一个bean的方法,你放置的价值观,仍然会在那里当你再次调用该方法(或bean的另一种方法)时。

对于有状态会话Bean,后续调用将使用相同的EJB实例容器担保,因此可以保持实例字段的值。

举一个例子起见,假设你有一个具有增量()和检索()方法的bean。增量增加存储值,并检索获取当前存储值。

对于一个无状态会话bean,如果你调用increment()方法5次,不能保证当你做一个retrieve()时,你会得到一个5.它取决于EJB的容器将分配给您的电话。所以如果你被分配了一个新的EJB实例,那么你会得到一个零。容器还没有清理你的EJB实例也是可能的,所以有可能得到一个5,但不能保证。

对于有状态会话bean,如果您调用increment方法5次,当您检索值时,您将得到一个5.容器保证第一次调用时使用的EJB将用于所有随后的调用。

+0

感谢您的时间和精力,如果你有时间你能解释一下我的第二个II。题 ? – cscsaba 2011-03-01 14:08:23

4

一个会话状态的一个真实世界的例子就是购物车。用户可以逐个添加多个商品到购物车,然后致电结帐。所有增加的时间会在那里

假设车是有状态的,即它会保持会话状态。

cart.add(item1); // suppose cart keep tracks of item by adding it to ArrayList 
cart.add(item2); 

cart.checkOut(); // at this stage both item1 and item2 would be there in ArrayList. 

如果购物车是无状态的,每次通话都将独立于以前的通话,并且在结帐时它什么也没有。

关于你的第二点 的区别是必要的,因为在这两种豆类的行为差异。维护状态需要资源,因此有状态bean不像无状态bean那样可伸缩。

+0

感谢您的时间和精力,如果您有时间可以解释我的第二个II。题 ? – cscsaba 2011-03-01 14:09:07

+0

再次感谢无能。 – cscsaba 2011-03-01 17:10:54

0

至于问题的第二部分,从Java EE 6教程中,你可以阅读以下内容:

当toUse会话Bean

如有以下

状态会话bean是适当的条件是真的。

  • bean的状态表示bean和特定客户端之间的交互。
  • bean需要在方法调用中保存有关客户端的信息。
  • bean在客户端和应用程序的其他组件之间进行调解,向客户端呈现简化的视图。
  • 在幕后,bean管理几个企业bean的工作流程。

要提高性能,可以选择无状态会话bean,如果它具有任何这些特性。

  • 该bean的状态没有针对特定客户端的数据。
  • 在单个方法调用中,bean为所有客户端执行通用任务。例如,您可以使用无状态会话bean发送确认在线订单的电子邮件。
  • 这个bean实现了一个web服务。

Java EE 6 Tutorial