【问题标题】:Session scoped Managed Bean passivation会话范围的托管 Bean 钝化
【发布时间】:2011-02-12 20:46:08
【问题描述】:

我正在阅读有关 JSF2 和托管 Beans 的信息。我有一个关于钝化的问题。

我最近在这里询问了@Stateful EJB、@SessionScoped@ManagedBean 的不同用例:

sessionscoped managed bean vs stateful ejb.

现在,有状态的 EJB 有资格进行钝化和激活,这允许它们暂时钝化到持久存储以减少空闲时的内存使用,我还没有看到托管 bean 可以使用此功能。所以这让我想到也许我应该选择@RequestScoped Managed Beans 而更喜欢@Stateful EJB 的购物车等。使用@Sessionscoped Managed Beans 仅用于存储最少的用户信息。

这是正确的吗?对此有一些指导方针吗?

【问题讨论】:

    标签: jakarta-ee jsf-2 ejb managed-bean ejb-passivation


    【解决方案1】:

    请求范围的托管 bean 在这里不起作用。要访问特定的有状态会话 bean 实例,您需要它的存根。

    如果您要使用请求范围内的托管 bean,则没有地方存储此存根,并且您将获得每个请求的新实例。这完全超越了首先使用有状态会话 bean 的原因。

    但是,您可以使用视图范围的 JSF 托管 bean(如果操作发生在单个页面上)或会话范围的 CDI bean(如果操作发生在多个页面上)。尤其是后者,您可以将对话范围与有状态会话 bean 的生命周期联系起来。

    请注意,所有这些都需要至少对 Java EE 有中等程度的了解。如果您对有状态会话 bean 的钝化不小心(例如,从不调用 @Remove 注释方法),它将逐渐占用您服务器的 HDD 空间。

    【讨论】:

    • 所以你建议我选择对话范围的 bean 而不是会话 bean,对吗?我想到了那个。但是即使现在我对有状态 EJB 有了更好的理解,它们似乎每次都越来越没用。除了扩展的持久性上下文,我想不出它们在 Web 应用程序中的用途。
    • 当您需要在实体上维护(乐观的)JPA 锁时,扩展持久性上下文是关键,例如以确保当一件商品被放入购物车时,最后一件商品不会同时出售给另一位顾客。
    • 顺便说一句,我并没有建议使用对话范围 bean 而不是有状态会话 bean,而是将它们结合起来。
    猜你喜欢
    • 2012-12-26
    • 2012-04-03
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 2012-06-27
    • 2014-06-30
    相关资源
    最近更新 更多