无状态EJB中的静态与实例成员

时间:2009-10-13 07:18:48

标签: java static ejb stateless

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

3 个答案:

答案 0 :(得分:1)

SLSB实例是池化的,因此在其生命周期内可能会提供许多请求,因此您说没有为每个请求重新创建实例变量。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

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