14

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;
}
  1. 这是正确的说法,即使 Spring bean 的默认范围是单例的,它EntityManager是线程安全的,因为 Spring 使用它ThreadLocal来绑定它的事务和EntityManager它?

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

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

  4. 据我记得,注入EntityManager. 在 Glassfish Java EE 实现中,发现@PersistenceContextas 注入点的是应用服务器。
    春天的时候是什么样子的?Spring Framework 是负责发现这些注释还是由 JPA 实现者负责?

4

1 回答 1

7

问题 2、3 和 4——Spring 不关注任何不是 Spring Bean 的类。因此 Spring 不关注你的MyServlet类。因此答案为

  • 2) 没有
  • 3) 只有 Spring 托管的 Bean
  • 4)这是Springs的责任,因为Spring是Container

对于问题 1)。它以这种方式工作,因此使用 Spring Injected Entity Manager 可以有效地节省线程。

于 2012-04-30T08:35:23.230 回答