我注意到我正在处理的项目上有一些奇怪的代码 - 它是一个SLSB EJB3,它使用私有实例变量来维护数据缓存(它甚至称之为dataCache或其他东西),使用getter /二传手。对于EJB2和bellow,这是一个典型的EJB反模式 - SLSB并不意味着在调用之间保留状态,因此无法保证在后续调用中您将看到相同的数据。我的一位同事说可能在EJB3中没问题(我们没有太多的EJB3经验),但仍然是一个无状态会话Bean - 为什么它试图保持状态,这没有意义。
任何人都可以确认这在EJB3版本中是否仍然是一个坏主意,或者不知道它是否正常?
谢谢你能提供帮助,Justin
答案 0 :(得分:1)
在EJB 3.1中,您可以通过使用单独的单例bean(带有@Singleton
注释)并通过@EJB
将其注入需要它的会话bean来干净地完成此操作。
在EJB 3.1之前,没有真正干净的方法,你必须使用某种黑客。
答案 1 :(得分:0)
对于EJB2和bellow,这是一个典型的EJB反模式 - SLSB并不意味着在调用之间保留状态,不能保证在后续调用中会看到相同的数据。
这是真的,这在某种程度上是一种气味(因为经常被错误地使用:人们往往忘记了无法保证获得相同的实例,容器可以从池中移除一些bean以释放资源,豆可以分布在JVM等上。
我的一位同事说可能在EJB3中没问题(我们没有太多EJB3经验),但仍然是一个无状态会话Bean - 为什么它试图保持状态,这没有意义。
EJB 2.x中的无状态会话Bean(SLSB)在EJB 3.0中仍然如此,SLSB仍然是SLSB,EJB 3.0没有重新定义无状态。
但是如果你使用一个实例变量来保存一些加载成本很高的只读资源(并且确保在null
时加载它),那么它应该没问题。< / p>