代码之家  ›  专栏  ›  技术社区  ›  Alf

ejb3+jsf2;无状态的,像有状态的

  •  1
  • Alf  · 技术社区  · 14 年前

    我在EJB容器中有一个无状态会话bean。如果我从JSF2表单调用它,它会很好地工作,但是如果我再次调用表单,它会显示我以前插入的相同数据。即使我关闭并重新打开浏览器,也会发生这种情况。我必须等几分钟,直到表单显示空字段。 没有为每个请求重新创建无状态会话bean。它表现得像一个庄严的国家。怎么了?

    应用服务器:Glassfish 3.0.1

    2 回复  |  直到 11 年前
        1
  •  2
  •   Community Lee Campbell    7 年前

    我最初的问题是:EJB3+Struts2。struts为每个请求创建新的会话bean,即使它是有状态的。

    Struts本身不做任何事情,它只做你告诉他的事情。我怀疑你只是误用了东西。显示一些代码来说明问题可能会有所帮助。

    现在,我发现JSF2为每个请求重用相同的会话bean,即使它是无状态的。

    一般来说这不是真的,你可以 任何 无状态会话bean(slsb)的实例。即使出于某些原因,您在特定情况下获得了相同的实例(可能是因为beans池配置),在使用slsb时,这不应该是一个问题,您应该 注意您得到的实例,当然不要依赖实例的状态(因为它们是无状态的)。

    回到你的问题上,我怀疑你滥用了SLSB,并期待着一些不真实的事情:

    • 不要期望在调用之间获得新初始化的实例,这不是无状态的意思。
      • 事实上,不要指望你会得到任何关于这个实例的信息。
    • 不要依赖于SLSB实例的状态(它们是无状态的,不应该依赖于状态)。
      • 不要在远程调用之间依赖实例变量。
      • 实际上,避免使用实例变量,可能不需要它们。

    相关问题

        2
  •  0
  •   mhshams    14 年前

    无状态会话bean不是 为每个请求重新创建。

    这是一个不正确的术语。没有保证为每个请求创建无状态bean的新实例。

    由于性能原因,容器将汇集一些无状态bean实例。

    池实例的数量取决于容器配置。