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

Pio*_*cki 12 spring thread-safety entitymanager java-ee-6 jpa-2.0

EntityManager根据定义,它不是线程安全的.Servlets规范说,在非分布式环境中,如果没有实现SingleThreadModel,每个定义只有一个servlet实例.

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

public class MyServlet extends HttpServlet {

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

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

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

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

Ral*_*lph 6

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

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

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

  • 我的意思是它根本不是一个Spring bean(这就是第一段的内容),所以没有注入,而`em`将为null. - 测试它,如果它不为空,那么真的很奇怪.你可以尝试使它成为一个Spring bean的一种方法是`@ Configurable`,但这需要真正的AspectJ,我真的不知道这是否适用于Servlets. (2认同)