@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;
}
  • 即使SpringBean的默认范围是singleton,Spring使用
    ThreadLocal
    绑定其事务和
    EntityManager
    时,
    EntityManager
    是线程安全的,这样说对吗

  • 上面的servlet示例在春季仍然有效吗?它仍然不是线程安全的吗

  • ThreadLocal
    方法是否只适用于Spring管理的bean,而普通servlet不是其中之一

  • 据我所知,容器负责注入
    EntityManager
    。在Glassfish Java EE实现中,是应用服务器发现了
    @PersistenceContext
    作为注入点。
    春天的天气怎么样?Spring框架是负责发现这些注释还是由JPA实现者负责

  • 问题2、3和4——Spring不关注任何不是Springbean的类。因此,Spring不会关注您
    MyServlet
    class。 因此,答案是

    • 2) 不是
    • 3) 只有春天管理的豆子
    • 4) 这是Spring的责任,因为Spring是容器

    关于问题1)。它是这样工作的,因此使用Spring注入的实体管理器可以有效地节省线程。

    谢谢Ralph。所以,说“2)是否”是指它不是线程安全的,因为这个servlet不是Springbean,所以实际上根本不会发生注入?可以将这样的Servlet标记为Springbean吗?不知何故,我觉得这是一个非常不寻常、不推荐、混乱的想法——理解Spring的机制只是一个理论问题。我的意思是,它根本不是Spring bean(这就是第一段的内容),因此没有注入,
    em
    将为空。-测试它,如果它不为null,那么会发生一些非常奇怪的事情。一种让它成为Springbean的方法是
    @Configurable
    ,但这需要真正的AspectJ,我真的不知道这是否适用于servlet。