如果我的@ManagedBean是@SessionScoped,我为什么要使用@Stateful?我以前在购物车和维护会话状态时使用过它,但由于托管bean将在用户会话期间保存,因此我可以将状态存储在那里,然后调用SLSB来执行业务逻辑。对吗?如果是,那么有状态的ejb将留给更具体的应用,比如当你需要事务时。
发布于 2011-01-30 23:57:06
通常,无状态会话bean可以用于解决许多业务问题。
有状态并不一定意味着只有远程服务器才会保持状态,尽管这肯定是一种选择。远程Swing客户端可以首先向有状态会话bean发送一堆数据,保留存根,然后发送一些对这些数据进行操作的命令。这使客户端不必每次都发送相同的(大量)数据。
在远程用例中,它确实在某种程度上反映了使用web客户端(浏览器)时HTTP会话的使用情况。主要区别在于这里的会话是每个bean的,而对于HTTP会话,会话是由许多bean共享的作用域。由于HTTP会话基于cookies,并且cookies对于整个浏览器的域是全局的,因此HTTP会话不能直接支持来自同一客户端的多个会话(例如,每个选项卡或每个窗口)。这对于有状态会话bean来说是微不足道的。
然而..。
与远程EJB对话的远程Swing客户端并不常见。
在您的问题中描述的上下文中,您通常将使用本地EJB,并将大多数状态存储在HTTP会话中(共享时要小心!)现在在视图作用域或对话作用域。
那么,最后,在这个场景中何时使用有状态会话bean呢?
一个重要的用例是JPA中的extended persistence context。通常使用事务范围的实体管理器,当实体跨越EJB方法调用的事务边界时,它将被分离。如果你想(乐观地)在用户交互之间锁定一个实体,这是不可取的。你会弄丢锁的。
使用扩展的持久性上下文,实体将保持附加状态,并且当您调用有状态会话bean返回时,锁将有效。这对于预览功能非常有用,可以确保当您在预览后确定时,没有其他人对实体进行任何更改。或者实际上,对于购物车,您希望确保在一段时间内,购物车中的商品不能出售给其他任何人。
https://stackoverflow.com/questions/4842066
复制相似问题