@Spring和Java EE中的PersistenceContext EntityManager线程安全
根据定义,@Spring和Java EE中的PersistenceContext EntityManager线程安全,spring,thread-safety,jpa-2.0,java-ee-6,entitymanager,Spring,Thread Safety,Jpa 2.0,Java Ee 6,Entitymanager,根据定义,EntityManager不是线程安全的。 Servlets规范指出,在非分布式环境中,如果不实现SingleThreadModel,每个定义只有一个servlet实例 因此,在Java EE中,当您通过@PersistenceContext将EntityManager注入Servlet的字段时,它不是线程安全的: public class MyServlet extends HttpServlet { // Not thread-safe, should be using
EntityManager
不是线程安全的。
Servlets规范指出,在非分布式环境中,如果不实现SingleThreadModel
,每个定义只有一个servlet实例
因此,在Java EE中,当您通过@PersistenceContext
将EntityManager
注入Servlet的字段时,它不是线程安全的:
public class MyServlet extends HttpServlet {
// Not thread-safe, should be using EMF instead.
@PersistenceContext
private EntityManager em;
}
ThreadLocal
绑定其事务和EntityManager
时,EntityManager
是线程安全的,这样说对吗ThreadLocal
方法是否只适用于Spring管理的bean,而普通servlet不是其中之一EntityManager
。在Glassfish Java EE实现中,是应用服务器发现了@PersistenceContext
作为注入点。春天的天气怎么样?Spring框架是负责发现这些注释还是由JPA实现者负责
MyServlet
class。
因此,答案是
- 2) 不是
- 3) 只有春天管理的豆子
- 4) 这是Spring的责任,因为Spring是容器
关于问题1)。它是这样工作的,因此使用Spring注入的实体管理器可以有效地节省线程。谢谢Ralph。所以,说“2)是否”是指它不是线程安全的,因为这个servlet不是Springbean,所以实际上根本不会发生注入?可以将这样的Servlet标记为Springbean吗?不知何故,我觉得这是一个非常不寻常、不推荐、混乱的想法——理解Spring的机制只是一个理论问题。我的意思是,它根本不是Spring bean(这就是第一段的内容),因此没有注入,
em
将为空。-测试它,如果它不为null,那么会发生一些非常奇怪的事情。一种让它成为Springbean的方法是@Configurable
,但这需要真正的AspectJ,我真的不知道这是否适用于servlet。