EJB3 + JSF2;无状态就像一个有状态的

时间:2010-08-28 12:40:41

标签: java-ee jsf-2 java-ee-6 ejb-3.1 stateless-session-bean

我在ejb容器中有一个无状态会话bean。如果我从jsf2表单调用它,它工作正常,但如果我再次回忆它,它会显示我之前插入的相同数据。即使我关闭并重新打开浏览器也会发生这种情况。我必须等几分钟,直到表单显示空字段。 不会为每个请求重新创建无状态会话Bean。它表现得像一个有状态的。怎么了?

应用程序服务器:Glassfish 3.0.1

2 个答案:

答案 0 :(得分:2)

  

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

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

  

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

通常情况下,您可以获取无状态会话Bean(SLSB)的任何实例。即使由于某些原因你在你的特定情况下得到相同的实例(可能是因为bean池配置),这在使用SLSB时根本不应该是一个问题,你应该关心你获得了什么样的实例,当然不依赖于实例的状态(因为它们是无状态的)。

回到你的问题,我怀疑你是在滥用SLSB并期待那些不正确的事情:

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

相关问题

答案 1 :(得分:0)

  

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

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

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

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