@PersistenceContext Spring和Java EE中的EntityManager线程安全性

时间:2012-04-30 08:22:53

标签: spring thread-safety jpa-2.0 java-ee-6 entitymanager

根据定义,

EntityManager 不是线程安全的。 Servlets规范说在非分布式环境中并且没有实现SingleThreadModel,每个定义只有一个servlet实例

因此,在Java EE中,当EntityManager通过@PersistenceContext注入Servlet的字段时 - 它不是线程安全的:

public class MyServlet extends HttpServlet {

    // Not thread-safe, should be using EMF instead.
    @PersistenceContext
    private EntityManager em;
}
  1. 这是正确的,即使Spring bean的默认范围是单例,EntityManager是线程安全的,因为Spring使用ThreadLocal来绑定它的事务和{{1它呢?

  2. 以上Servlets示例在Spring中仍然有效吗?它仍然不是线程安全的吗?

  3. EntityManager方法是否仅适用于Spring托管bean,而普通servlet不是其中之一?

  4. 据我记忆,注入ThreadLocal是容器的责任。在Glassfish Java EE实现中,应用程序服务器发现EntityManager作为注入点 它在Spring中看起来如何? Spring Framework是否负责发现这些注释或JPA实现者的责任?

1 个答案:

答案 0 :(得分:6)

问题2,3和4 - Spring不关注任何不是Spring Bean的类。因此,Spring并不关注你MyServlet课程。 因此答案为

  • 2)没有
  • 3)只有Spring管理的豆子
  • 4)它是Springs责任,因为Spring是Container

问题1)。它以这种方式工作,因此Spring Injected Entity Manager的使用是有效的线程保存。