【发布时间】:2011-09-13 19:14:17
【问题描述】:
基于这篇帖子http://www.adam-bien.com/roller/abien/entry/ejb_3_1_killed_the 我在我的应用程序中使用@Named @Stateless bean 与数据库进行通信(在此处注入 EntityManager)并在 jsf 页面上显示信息。自 Java EE 5 以来,这是一个很大的便利,但我有一个问题。
使用此类 bean 来维护用户会话(购物车等)是否安全?我读过一本关于 ejb 3.0 的书,我知道同一个无状态 bean 可以用于许多客户端。
使用具有所有 ejb 功能(事务、线程安全等)的托管 bean 的最佳方法是什么?我的意思是除了托管 bean + ejb 接口与 Java EE 5 中的实现 + ejb 注入之外的任何其他方式?
我使用 GlassFish 3.1 WebProfile
【问题讨论】:
-
感谢您的回答,那么我应该使用@Named @Stateful 还是 jsf 会话?哪个更好/更轻?当用户关闭浏览器和 ejb 会话时,jsf 会话结束?
-
或者也许将 ENtityManager 注入到 ManagedBean 中?安全吗?
-
EJB 会话不一定会在用户关闭浏览器时结束,但 Web 用户以后将无法再次连接 EJB 会话。 EJB 代理通常保存在 http 会话、会话或视图范围内,当主 http 会话结束时,它们都会被销毁。
-
>或者也许将 EntityManager 注入到 ManagedBean 中? - 可能,但不如使用 EJB 方便,因为在这种情况下您需要自己处理启动、提交或回滚事务。如果托管 bean 被注入实体管理器,它也应该 - 不 - 是会话范围的。您需要将数据(会话范围)与数据库操作分开。实体管理器通常不是线程安全的。
标签: java jsf-2 java-ee-6 cdi ejb-3.1