1

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

应用服务器:Glassfish 3.0.1

4

2 回答 2

2

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

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

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

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

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

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

相关问题

于 2010-08-29T01:19:11.090 回答
0

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

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

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

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

于 2010-08-28T12:52:37.697 回答