【问题标题】:Static vs Instance members in Stateless EJBs无状态 EJB 中的静态与实例成员
【发布时间】:2009-10-13 07:18:48
【问题描述】:

我有一个需要访问工厂类的无状态会话 bean。是否最好将此工厂类声明为 SLSB 中的静态或实例成员?我是否正确地说,由于 SLSB 被重用,每个 bean 只会创建一个工厂实例(当使用实例成员选项时),而不是每个请求一个实例?

【问题讨论】:

    标签: java static ejb stateless


    【解决方案1】:

    SLSB 实例是池化的,因此在其生命周期内可能会服务许多请求,因此正如您所说,不会为每个请求重新创建实例变量。

    SLSB 的“自然”方式是让每个实例独立,没有静态,不需要实例之间的同步。因此,如果可能的话,我会为每个 SLSB 实例提供一个工厂实例。

    【讨论】:

      【解决方案2】:

      不要假设每个请求都不会创建 SLB 的实例。容器有权为每个请求创建一个;同样,它也允许只有一个实例(我认为)。更一般地说,容器将维护它们的池。

      如果实例化和/或初始化您的 SLSB 相对昂贵,您应该准确调查您的容器将做什么,如果可能的话,将其明确配置为您希望它做什么。

      假设你这样做了,那么在 SLSB 类中保留一个实例字段应该没有问题。

      【讨论】:

      • 有趣。我可以想象容器可能选择通过有效地使池大小为零来响应压力的场景,并且我可以想象选择不配置池的情况。我还可以看到,规范的后者将允许容器为每个请求创建一个新实例,但这是否真的在有用的生产质量环境中遇到过?
      • 我对此表示怀疑,但规范确实允许这样做,因此代码不应假设其他情况,除非您明确限制容器配置.
      【解决方案3】:

      只要从池中重用 SLSB,就不会重新创建实例变量。 SLSB 的生命周期相当简单:创建一个实例,使用它 n 次来处理 n 个请求,并最终将其丢弃。所有这些动作都由容器执行。所以在bean的创建过程中(由我们控制)我们可以初始化这些实例变量。但是一旦初始化就不要修改这些变量的内容,以免产生副作用。

      如果您愿意,您可以使用静态实例,但请记住,您必须手动处理同步问题;而且,你被限制在本地工厂。

      带有@Singleton EJB 的EJB 3.1 提供了一个非常优雅的解决方案。

      【讨论】:

        猜你喜欢
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-10
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        相关资源
        最近更新 更多