【问题标题】:EJB3 Caching Instance VariablesEJB3 缓存实例变量
【发布时间】:2011-04-08 20:32:13
【问题描述】:

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

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

谢谢你,贾斯汀

【问题讨论】:

    标签: variables jakarta-ee ejb-3.0 instance stateless-session-bean


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      相关问题

      【讨论】:

      • 感谢 Pascal,这证实了我的怀疑
      • “但是如果你使用一个实例变量来保存一些加载成本很高的只读资源(如果为空,请确保加载它),它应该没问题。”不推荐这个。由于 SLSB 提供的合同附带的所有警告(无状态、池化、代理、容器认为合适的临时 GC 等),该值应该被注入或管理“不在 SLSB 中”的某个地方。将值加载到会话上下文 CDI bean(或类似的维护状态的上下文)中,并在需要时注入它。
      猜你喜欢
      • 1970-01-01
      • 2019-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      相关资源
      最近更新 更多