spring - Spring 和 Java EE 中的 @PersistenceContext E

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

因此,在 Java EE 中,当您通过 @PersistenceContextEntityManager 注入(inject) Servlet 的字段时 - 它不是线程安全的:

public class MyServlet extends HttpServlet {

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

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

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

  4. 据我所知,注入(inject) EntityManager 是容器的责任。在 Glassfish Java EE 实现中,发现 @PersistenceContext 作为注入(inject)点的是应用服务器。
    Spring 的时候是什么样子的? Spring Framework 是负责发现这些注释还是由 JPA 实现者负责?

最佳答案

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

的答案
  • 2) 不是
  • 3) 仅限 Spring 托管的 Beans
  • 4) 这是 Springs 的责任,因为 Spring 是容器

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

关于spring - Spring 和 Java EE 中的 @PersistenceContext EntityManager 线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10380539/

相关文章:

spring - 如何在集成测试阶段使用 Spring 嵌入式数据库初始化脚本?

java - 如何使用 RestTemplate 为每个请求设置 RequestConfigurat

java - JtaTransactionManager 和 ChainedTransactionM

java - AsyncContext 响应与原始传入请求不匹配?

java - STS Spring 与 Roo 和 Maven - 太慢了?

java - 无法使用 JAXB org.springframework.oxm.Unmarshal

java - 如何覆盖 Spring 3.1 @PropertySource 以设置 IgnoreR

java - 使用 spring-hateoas 反序列化包含(_links 和 _embedded

spring - IntelliJ + Tomcat + Spring-Loaded

java - Spring REST Controller 返回带有空数据的 JSON