会话bean的会话状态

时间:2011-03-01 10:06:46

标签: java-ee ejb-3.0 java-ee-6

我正在读一本关于Java EE 6的书,我遇到了以下几个部分:

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

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

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

提前致谢。

II。为什么豆类的这种分类如此重要?无论是正确解释还是初学者(乍一看)都没有说明任何内容 所以,多亏了你,我得到了逻辑上的差异,但为什么这种行为如此重要呢?

3 个答案:

答案 0 :(得分:11)

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

对于无状态会话bean,容器不保证后续方法调用将使用相同的EJB实例(来自池),因此您不能假设在调用bean方法时放置的值仍然存在你再次调用该方法(或bean的另一种方法)。

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

为了举例,假设您有一个具有increment()和retrieve()方法的bean。增量会增加存储的值,并且retrieve会获取当前存储的值。

对于无状态会话bean,如果你调用increment()方法5次,则无法保证当你执行retrieve()时,你会得到一个5.它取决于容器哪个EJB它'将分配给您的电话。因此,如果为您分配了一个新的EJB实例,那么您将获得零。容器也可能没有清理你的EJB实例,因此有可能获得5 - 但不能保证。

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

答案 1 :(得分: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那样可扩展。

答案 2 :(得分:0)

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

  

何时使用会话Bean

     

如果满足以下任一条件,则有状态会话bean是合适的。

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

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

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

Java EE 6 Tutorial