0

关于会话 EJB 的使用,到目前为止,我在“现实世界的应用程序”(如果我没记错的话)中看到的是无状态会话 EJB,用作事务(通过 CMT)业务逻辑方法的“门面”。不过,我还没有看到任何有状态的会话 EJB。实际上,在 Java EE 书籍中,它们被用作“购物车”,这意味着它们的状态应该以某种方式存储在持久存储中。但这似乎表明,在数据库中建模的应用程序域的其他部分也应该映射到有状态的 EJB-s,这似乎过于复杂。

那么,根据您的经验/专长,您能否给出具体示例,说明在当今(例如,与 2003 年相比)应用程序中如何使用有状态会话 EJB?

4

2 回答 2

2

有状态的 EJB 可以将它们的状态保存在数据库中,但有状态的 EJB 不一定需要将它们的状态保存在数据库中。有状态的 EJB 必须在内存中存储和记住与客户端的对话状态,仅在“对话”期间。

根据Java EE 7 教程,您可以在下面找到一些在某些情况下适合有状态 EJB 使用的真实世界示例:如果满足以下任何条件,则有状态会话 bean 是合适的。

  • bean 的状态表示 bean 和特定客户端之间的交互。真实世界示例:具有登录、操作、注销的在线事务的有状态 EJB 实现。

  • bean 需要跨方法调用保存有关客户端的信息。真实世界示例:有状态 EJB 可用于实现购物卡。数据可以保留或不保留,例如对于不需要登录的 eshop,如果用户最终没有结帐他收集的商品,则可能会丢弃购物卡。

  • bean 在客户端和应用程序的其他组件之间进行调解,向客户端呈现一个简化的视图。有状态 EJB 可用于实现持久性抽象。

  • 在幕后,bean 管理着几个企业 bean 的工作流。真实的例子:有状态的 EJB 可用于实现在线假期预订交易,其中 EJB 模拟一个代理,该代理使用其他 EJB 从不同的供应商预订机票、汽车和酒店,然后将结果返回给客户端。

上面的例子证明了这个概念在一些例子中的适用性。实际上,现在在真实环境中使用有状态 EJB 会产生更纯粹的设计,但是如果考虑到性能和复杂性,它就不是最优的了。另请参阅Web 应用程序中的有状态 EJB?.

于 2016-08-05T08:27:39.433 回答
1

我们目前在生产环境中运行的一个应用程序中有几个有状态的 EJB。所以我想,它可以被视为一个真实世界的例子。

该 EJB 用于通过将这些数据分成块并按需发送这些块来向客户端提供大量数据。所有这些工作如下:

  • 客户端准备一个请求,指定他想要查找数据的过滤器;
  • 他使用有状态 EJB 方法提交此请求;
  • 在服务器上处理请求并准备结果集;
  • 作为对其请求的响应,客户端获取服务器端结果集的描述符;
  • 有了这个描述符,他现在可以使用 Stateful bean 方法获取数据块。

Stateful bean 是解决此类问题的必要条件吗?一点也不。

所描述的功能可以通过无状态 bean 来实现。但在这种情况下,我们只有两种实现方式。每次客户端需要下一个数据块(因为我们没有任何状态)时,我们都被迫为请求准备结果集,或者我们使用一些静态存储并自己处理安全性和并发访问。/这里的安全性是指防止一个客户端可以使用他的描述符访问另一个客户端的结果集的情况/

与在有状态 bean 上的实现相比,第一种方法更慢且效率更低。由于同步,第二种方式在负载下更复杂且稳定性较差。

使用 Stateful bean,我们只需以一种有效的方式获得我们需要的东西,而无需额外的努力。

于 2016-08-05T18:11:17.530 回答