我从未使用过有状态的 EJB。我知道有状态的 EJB 对 java 客户端很有用。
但我想知道:在哪种情况下在 Web 应用程序上使用它们?如何?我们是否应该将这些有状态的 bean 放在 Session 中(因为无状态的 http)?
这是一个好习惯吗?(无需过多讨论有状态与无状态)
我从未使用过有状态的 EJB。我知道有状态的 EJB 对 java 客户端很有用。
但我想知道:在哪种情况下在 Web 应用程序上使用它们?如何?我们是否应该将这些有状态的 bean 放在 Session 中(因为无状态的 http)?
这是一个好习惯吗?(无需过多讨论有状态与无状态)
有趣的是,这是当天关于 SFSB 和网络应用程序的第二个问题,而这个话题通常并不常见。
在哪种情况下在 Web 应用程序上使用它们?
SFSB 和 Web 应用程序的传统示例是购物车。但同时,您可以对HttpSession
.
理想情况下,如果状态与业务逻辑而不是表示逻辑相关,它应该进入 SFSB。但在实践中,人们通常反对 SFSB(因为它引入了复杂性),除非他们提供了一些你不能用HttpSession
. 大多数时候,您可以调整设计以将信息存储在HttpSession
数据库中并传递它,而无需 SFSB。但这归根结底是设计纯度的问题。
如何?我们是否应该将这些有状态的 bean 放在 Session 中(因为无状态的 http)?
EJB 模型比 EJB 模型更丰富HttpSession
,因为 EJB 是事务性组件,并且对于 SFSB 的钝化和激活有显式回调。这增加了如何正确使用 SFSB 的复杂性,特别是 (1) 异常处理和 (2) 并发性以及 (2) SFSB 的删除和超时。有关更多详细信息,请参阅我的答案:
如果您想使用它们,您首先需要查找 SFSB 以获取对一个新远程实例的引用。然后,您需要将此引用存储在某处,以便跨请求重用它。这在某处通常是HttpSession
,这意味着即使您使用 SFSB,也无法完全摆脱它。
使用 EJB2,远程引用(称为句柄)可以被序列化以供以后重用。然后可以将 if 存储在数据库中,即使我从未见过。我不知道 EJB3 是否仍然可行。
这是一个好习惯吗?
正如我已经说过的,人们通常反对它,除非你确切地知道为什么要使用它们,而不是HttpSession
并且只有当你对 EJB 模型有很好的掌握时。(例如,如果可以通过 Web 前端和桌面客户端访问业务服务,SFSB 可能是合理的)许多其他框架没有类似于 SFSB 的东西,人们仍然设法使用它们创建出色的应用程序。
PS:我在一个网络应用程序中使用过 SFSB,它确实比 SFSB 使用起来更棘手HttpSession
,但它最终奏效了。