2009-10-13 49 views
1

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

回答

1

SLSB实例被集中在一起,因此可能会在其整个生命周期中提供很多请求,所以如您所说,不会为每个请求重新创建实例变量。

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

1

不要认为每个请求都不会创建SLB的实例。该容器的权利在于创建一个请求;同样,它也被允许只有一个实例(我认为)。更一般地说,容器将保持一个池。

如果实例化和/或初始化您的SLSB相对昂贵,您应该调查您的容器将会执行的操作,并且如果可能的话,明确地将其配置为您希望的操作。

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

+0

有趣。我可以想象一个容器可能选择通过有效地拥有零池大小来应对压力的场景,我可以想象选择不配置池。我还可以看到,后者的规范允许容器为每个请求创建一个新实例,但实际上是否在有用的生产质量环境中遇到了这种情况? – djna 2009-10-13 17:38:48

+0

我对此表示怀疑,但spec *确实允许它,因此代码不应该假设其他情况,*除非*您明确约束了容器配置。 – skaffman 2009-10-13 19:58:58

0

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

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

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