2012-04-30 43 views
10

EntityManager非线程安全的定义。 Servlets规范说,在非分布式环境中并且没有实现SingleThreadModel,每个定义只有一个servlet实例@PersistenceContext EntityManager在Spring和Java EE中的线程安全性

因此,在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来绑定其交易并且EntityManager它?

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

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

  4. 据我记忆,注射EntityManager是集装箱的责任。在Glassfish Java EE实现中,应用服务器发现@PersistenceContext作为注入点。
    它在春天看起来如何? Spring框架是否负责发现这些注释或者它是JPA实现者的责任?

回答

5

问题2,3和4 - Spring不关注任何不是Spring Bean的类。因此,Spring不关注你MyServlet类。 因此,对于

  • 2)的答案是否定的
  • 3)只Spring管理豆
  • 4)它是春天的责任,因为春天是集装箱

问题1)。它以这种方式工作,所以Spring注入实体管理器的使用是有效的线程保存。

+0

谢谢拉尔夫。所以,通过说“2)不是”,你的意思是说它不是线程安全的,因为这个servlet不是一个Spring bean,所以实际上**不会发生任何注入**?是否有可能将这样的Servlet标记为Spring bean?我以某种方式觉得这是非常罕见的,不推荐的和凌乱的想法 - 这只是理解Spring的机制的理论问题。 –

+1

我的意思是它根本就不是Spring bean(这是关于第一段的内容),所以没有注入,而'em'将为空。 - 测试它,如果它不是null,那么真的很奇怪。你可以尝试使它成为spring bean的一种方法是“@ Configurable”,但这需要真正的AspectJ,我真的不知道这是否适用于Servlet。 – Ralph

相关问题