Web 应用程序中的有状态 EJB?

Posted

技术标签:

【中文标题】Web 应用程序中的有状态 EJB?【英文标题】:Stateful EJBs in web application? 【发布时间】:2011-02-18 04:08:19 【问题描述】:

我从未使用过有状态的 EJB。 我知道有状态的 EJB 对 java 客户端很有用。

但我想知道:在什么情况下在 Web 应用程序上使用它们?如何? 我们是否应该将这些有状态的 bean 放在 Session 中(因为无状态的 http)?

这是一个好习惯吗? (无需过多讨论有状态与无状态)

【问题讨论】:

【参考方案1】:

很有趣,这是当天关于 SFSB 和网络应用程序的第二个问题,而这个话题通常并不常见。

在这种情况下在网络上使用它们 申请?

SFSB 和网络应用的传统示例是购物车。但与此同时,您可以对HttpSession 执行相同的操作。

理想情况下,如果状态与业务逻辑相关而不是表示逻辑,则它应该放在 SFSB 中。但在实践中,人们通常反对 SFSB(因为它引入了复杂性),除非他们提供了您无法通过 HttpSession 轻松完成的事情。大多数时候,您可以调整设计以将信息存储在HttpSession 或数据库中并传递它,而无需使用 SFSB。但这最终是一个设计纯度问题

然后怎么做?我们应该把这些有状态的 Session 中的 bean(因为无状态 http)?

EJB 模型比HttpSession 更丰富,因为EJB 是事务性组件,并且对于SFSB 的钝化和激活有显式回调。这带来了增加了复杂性关于如何正确使用 SFSB,特别是 (1) 异常处理和 (2) 并发性以及 (2) SFSB 的删除和超时。请在此处查看我的答案以获取更多详细信息:

Java: Tracking a user login session - Session EJBs vs HTTPSession Correct usage of Stateful Beans with Servlets

如果您想使用它们,您首先需要查找 SFSB 以获取对一个新远程实例的引用。然后,您需要将此引用存储在某处,以便跨请求重用它。这个somewhere通常是HttpSession,这意味着即使你使用SFSB,你也无法完全摆脱它。

使用 EJB2,远程引用(称为句柄)可以被序列化以供以后重用。然后可以将 if 存储在数据库中,即使我从未见过。我不知道 EJB3 是否仍然可行。

这是一个好习惯吗?

正如我已经说过的,人们通常会反对它,除非您确切知道为什么要使用它们而不是 HttpSession,并且只有您对 EJB 模型有很好的掌握。 (例如,如果可以通过 Web 前端和桌面客户端访问业务服务,SFSB 可能是合理的)许多其他框架没有具有与 SFSB 类似的东西,但人们仍然设法创建出色的应用程序。

PS:我在网络应用程序中使用过 SFSB,它确实比HttpSession 更难使用,但它最终奏效了。

【讨论】:

SFSB 的一个额外原因是利用 JPA 中的 extended persistence context。这是一门高级科目,应该适度使用,但如果你需要它,这绝对是选择 SFSB 的理由。

以上是关于Web 应用程序中的有状态 EJB?的主要内容,如果未能解决你的问题,请参考以下文章

WEB容器和EJB容器

Spring 上下文中的有状态 bean 和无状态 bean

雷林鹏分享:EJB有状态会话Bean

雷林鹏分享:EJB有状态会话Bean

用于动态应用程序的有状态 Web 框架

是否可以在 GlassFish 3.1 上为无状态 ejb Web 服务定义 servlet 过滤器