相同的无状态会话 Bean 在相同的应用程序中工作不同

Same stateless session bean working different in same application

我创建了一个无状态会话 bean (SLSB) 并从同一个 JVM 进行本地调用。初始化时,我在 SLSB 中有一个 BO 局部变量,我设置了这个值,在下一次调用中,我正在执行一些业务功能,但在下一次调用中,我无法获得我在上一次设置的值。称呼。 这似乎是根据 SLSB 功能,但在我们应用程序的另一部分中有类似的功能。我已经确认两者都是 SLSB,并且在 ejb-jar.xml 和 weblogic-ejb-jar.xml 中没有完成连接池(也都相同)我也调试了 class 但没有线索它在另一个 class.

中是如何工作的

我想知道除了连接池之外,还有其他方法可以实现无状态会话 bean 的状态完整行为。

这里的重要(如果稍微明显)教训是:不要将状态存储在无状态会话 bean 中。如果要存储会话状态,请使用 stateful bean, if you want shared state use a singleton bean. You could also use an entity bean 来保存状态。

这在其他地方起作用的原因很可能与 bean 池有关。 EJB 容器主要使用 bean 池来存储它们的无状态 bean,因为这提供了最好的性能和可伸缩性。当一个请求进来时,容器从池中选择一个 bean 来为它服务,将它从池中取出,bean 处理请求,然后放回池中。选择哪个 bean 取决于容器,因为理论上它们都是可以互换的。

如果您在 bean 中设置一个成员变量,然后发现(有时)稍后的调用会发现该变量设置为您的值,这表明容器已将相同的 bean 实例返回给您。这是不确定的 - 它取决于服务器负载、池大小和容器的策略。