我可以使用带有CDI的EJB无状态Bean来维护用户会话吗?

m1m*_*m1m 3 java cdi java-ee-6 jsf-2 ejb-3.1

基于这篇文章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

Arj*_*jms 10

加入duffymo的建议; 使用有状态会话bean与使用HTTP会话还有一些其他注意事项.

HTTP会话基本上具有类似于结构的映射.它直接可用于作为会话一部分的所有线程(请求).这使得操纵几个项目成为相对不安全的操作.可以在会话本身上进行同步,但这是一个危险的操作,可能会使整个应用程序死锁.HTTP会话允许您声明事件侦听器,该侦听器在对http会话进行任何类型的修改时触发.

有状态会话bean当然有一个bean结构.它具有一种自动同步功能,因为只有线程可以在bean中同时处于活动状态.通过注释,您可以声明其他线程是否等待(如果是,等待多长时间)或者在并发访问时立即抛出异常.

通常每个用户只有一个http会话,单个用户可以同时使用多个有状态会话bean.有状态会话bean的一个特殊优点是它们有一种机制可以在一些超时后钝化它们的状态,这可以释放服务器的内存(当然是以磁盘空间为代价).有状态会话bean不直接具有http会话所具有的事件侦听器类型.

我认为最初有状态会话bean的"会话"方面是维护与远程非Web客户端(Swing,另一个AS等)的会话.这非常类似于创建http会话以维护与远程Web客户端的会话.由于非Web客户端可以请求并保留有状态会话bean的多个代理,因此Web类比实际上更类似于最近引入的代理conversation scope.

在远程Web客户端与服务器通信的情况下,服务器内部与有状态会话bean对话,概念大大重叠.远程Web客户端只知道http会话(通过JSESSIONID),而不知道有状态会话bean的会话.因此,如果http会话丢失,您通常无法再次使用特定的有状态会话bean连接远程客户端.因此,在这种情况下,HTTP会话始终处于领先地位,您也可以将购物车项目存储在单个(http)会话范围的bean中.

有一种特殊情况,有状态会话bean可以用于内部通信,如果你需要JPA的话extended persistence context.如果例如实体上的锁定需要在请求之间持续(例如,如果您的库存有限并且不希望在实际上他不想用"缺货"消息面对用户时,则可以使用此功能退房).


duf*_*ymo 6

无国籍豆无法维护购物车或会话; 这就是"无国籍"的含义.

您需要有状态EJB或在Web层中执行它.这些是唯一保持会话的地方.