语境
简单的 Java EE 6 (JBoss AS 7.1) CRUD Web 应用程序,使用@Named支持 bean, JSF 页面的@SessionScope:
问题
为什么将 HTTP 会话状态存储在 CDI bean 上不是一个好主意?例如,将购物车项目存储在那里。
评论
由于它们的会话状态,SFSB 就是为此而设计的,但我读到它们在实践中并不容易使用。另外我认为另一个选择是HttpSession对象。
我也知道他们拥有的钝化/激活优势。
语境
简单的 Java EE 6 (JBoss AS 7.1) CRUD Web 应用程序,使用@Named支持 bean, JSF 页面的@SessionScope:
问题
为什么将 HTTP 会话状态存储在 CDI bean 上不是一个好主意?例如,将购物车项目存储在那里。
评论
由于它们的会话状态,SFSB 就是为此而设计的,但我读到它们在实践中并不容易使用。另外我认为另一个选择是HttpSession对象。
我也知道他们拥有的钝化/激活优势。
我认为您对用于 HTTP 会话的“会话”和用于与特定 bean 的会话(在这种情况下为有状态 bean)的会话感到困惑。
它们有不同的用途,但也有重叠。最初,带有 SFSB 的会话用于非 HTTP 远程客户端(Applet 和 Swing 应用程序)。在某种程度上,您可以说它是 HTTP 会话的 RMI 等价物。
当已经有可用的 HTTP 会话时,为此目的使用有状态会话 bean 是没有意义的,您最好使用 HTTP 会话范围 bean。
不过,有状态会话 bean 确实有它们的用途,例如它们能够适应扩展的持久性上下文,并且可以在事务之外保持例如(乐观)锁打开。
在 Java EE 6 Web 应用程序中使用时,您通常希望为有状态会话 bean 分配一个 HTTP 会话范围。否则,即使 bean 有一个内部会话,它也没有连接到任何东西,而是连接到您用来与之通信的代理。
另见:
以下是 SFSB 的假定好处:
为这些付出的代价是异常方案更复杂(回滚、非回滚异常等)、生命周期以及结果调试。
通常,您不需要钝化/激活。为了使设计具有可扩展性,请尽可能少地存储在内存中。通常,也不需要扩展持久性上下文(尽管它们有其用途)。
但是,请求必须以事务方式处理。但是你不需要SFSB。您可以自己处理错误和恢复,以确保您的 HttpSession 是一致的。不过,请确保您使用事务来访问您的后端!