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

Seb*_*ber 15 web-applications stateful java-ee ejb-3.0

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

但我想知道:在哪种情况下在Web应用程序中使用它们?如何?我们应该把这些有状态的bean放在Session中吗(因为无状态的http)?

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

ewe*_*nli 30

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

在哪种情况下在Web应用程序中使用它们?

SFSB和Web应用程序的传统示例是购物车.但与此同时,你也可以这样做HttpSession.

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

如何?我们应该把这些有状态的bean放在Session中吗(因为无状态的http)?

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

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

使用EJB2,远程引用(称为句柄)可以序列化,以便以后重用.然后可以存储,例如在数据库中,即使我从未见过它.我不知道EJB3是否还可以.

这是一个好习惯吗?

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

PS:我在网络应用程序中使用了SFSB,它确实比使用HttpSession它更难,但它最终起作用.

  • SFSB的另一个原因是利用JPA中的"扩展持久化上下文".这是一个高级科目,应该适度使用,但如果你需要它,这绝对是去SFSB的理由. (5认同)