我正在阅读有关JSF2和Managed Beans的内容。我有一个与钝化有关的问题。
我最近在这里要求@Stateful
EJB,@SessionScoped
和@ManagedBean
的不同用例:
sessionscoped managed bean vs stateful ejb
现在,有状态EJB有资格进行钝化和激活,这使得它们可以暂时钝化到持久存储以减少空闲时的内存使用,我还没有看到这个功能可供管理员使用。所以它让我想到也许我应该选择@RequestScoped
Managed Beans而不是@Stateful
EJB用于购物车等。仅使用@Sessionscoped
Managed Beans存储最少的用户信息。
这是对的吗?是否有一些指导原则?
答案 0 :(得分:2)
请求范围的托管bean在此处不起作用。要访问特定的有状态会话Bean实例,您需要它的存根。
如果您要使用请求范围的托管bean,则没有地方存储此存根,您将获得每个请求的新实例。这完全击败了首先使用有状态会话bean的原因。
但是,您可以使用视图范围的JSF托管bean(如果操作发生在单个页面上)或会话范围的CDI bean(如果操作发生在多个页面上)。特别是对于后者,您可以将对话的范围与有状态会话bean的生命周期联系起来。
请注意,所有这些都需要至少对Java EE的中间理解。如果你不小心对有状态会话bean进行钝化(例如从不调用@Remove带注释的方法),它将逐渐吞噬服务器的硬盘空间。