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