ejb 线程安全:我们需要它吗?
ejb thread safety: do we need it?
考虑无状态 EJB
from ejb 3.1 spec
containers will support many instances of a session
bean executing concurrently; however, each instance sees only a
serialized sequence of method calls. Therefore, a stateful or
stateless session bean does not have to be coded as reentrant
所以无状态会话 bean 一次最多可以 "serve" 一个请求,
这通常由管理 beans 池的容器实现。
所有这一切的伟大目标是线程安全。
我的问题是为什么我们需要这种形式的线程安全?
我的意思是 Spring bean 是单例的并且不是线程安全的(它们可以一次处理任意数量的请求)并且我们对此没有问题。
如果无状态会话 bean 具有本身不是线程安全的成员变量(例如 SAXParser),则您需要这种形式的线程安全。但是,由于无状态会话 bean 不像有状态会话 bean 那样具有客户端亲和力,因此用例相对较少,而且 servlet 编程模型似乎已经表明这种保护级别可能没有必要,所以如果您不需要线程安全,然后从 EJB 3.1 开始,您可以使用具有 bean 管理的并发性的单例会话 bean。
线程安全限制还为 EJB 容器提供了一些额外的优化自由。例如,如果 EJB 容器知道一次只有一个线程可以使用无状态会话 bean,那么它可以在方法 entry/exit 处操纵注入对象的状态,这样这些对象就不需要使用 ThreadLocal (例如,UserTransaction 或 SessionContext)。
考虑无状态 EJB
from ejb 3.1 spec
containers will support many instances of a session
bean executing concurrently; however, each instance sees only a
serialized sequence of method calls. Therefore, a stateful or
stateless session bean does not have to be coded as reentrant
所以无状态会话 bean 一次最多可以 "serve" 一个请求, 这通常由管理 beans 池的容器实现。 所有这一切的伟大目标是线程安全。
我的问题是为什么我们需要这种形式的线程安全? 我的意思是 Spring bean 是单例的并且不是线程安全的(它们可以一次处理任意数量的请求)并且我们对此没有问题。
如果无状态会话 bean 具有本身不是线程安全的成员变量(例如 SAXParser),则您需要这种形式的线程安全。但是,由于无状态会话 bean 不像有状态会话 bean 那样具有客户端亲和力,因此用例相对较少,而且 servlet 编程模型似乎已经表明这种保护级别可能没有必要,所以如果您不需要线程安全,然后从 EJB 3.1 开始,您可以使用具有 bean 管理的并发性的单例会话 bean。
线程安全限制还为 EJB 容器提供了一些额外的优化自由。例如,如果 EJB 容器知道一次只有一个线程可以使用无状态会话 bean,那么它可以在方法 entry/exit 处操纵注入对象的状态,这样这些对象就不需要使用 ThreadLocal (例如,UserTransaction 或 SessionContext)。