2

我注意到我正在处理的一个项目中有一些奇怪的代码——它是一个 SLSB EJB3,它使用一个私有实例变量来维护一个数据缓存(它甚至称它为 dataCache 或其他东西),带有一个 getter/setter。对于 EJB2 及以下内容,这是典型的 EJB 反模式 - SLSB 并不意味着在调用之间保留状态,不能保证您在后续调用中会看到相同的数据。我的一位同事说它在 EJB3 中可能没问题(我们没有太多 EJB3 经验),但它仍然是一个无状态会话 Bean - 为什么它试图保持状态,这没有意义。

谁能确认这在 EJB3 领域是否仍然是一个坏主意,或者是否可以?

谢谢,如果你能帮忙,贾斯汀

4

2 回答 2

1

在 EJB 3.1 中,您可以通过拥有一个单独的单例 bean(带有@Singleton注释)并通过@EJB它注入到需要它的会话 bean 中来干净地做到这一点。

在 EJB 3.1 之前,没有真正干净的方法,您必须使用某种 hack。

于 2010-12-24T18:54:33.690 回答
0

对于 EJB2 及以下版本,这是典型的 EJB 反模式 - SLSB 并不意味着在调用之间保留状态,无法保证您会在后续调用中看到相同的数据。

这是真的,这在某种程度上是一种气味(因为经常被错误地使用:人们往往忘记了不能保证获得相同的实例,容器可以从池中删除一些 bean 以释放资源,bean 可以分布在JVM 等)。

我的一位同事说它在 EJB3 中可能还可以(我们没有太多的 EJB3 经验),但它仍然是一个无状态会话 Bean - 为什么它试图保持状态,这没有意义。

EJB 2.x 中的无状态会话 Bean (SLSB) 的情况在 EJB 3.0 中仍然适用,SLSB 仍然是 SLSB,EJB 3.0 没有重新定义无状态。

但是,如果您使用实例变量来保存一些加载成本很高的只读资源(并确保在 if 中加载它null),它应该没问题。

相关问题

于 2010-09-07T00:29:28.160 回答