gpt4 book ai didi

Spring : @PersistenceContext and @Autowired thread safety?

转载 作者:行者123 更新时间:2023-12-04 14:34:36 27 4
gpt4 key购买 nike

基于这个例子:

@Service
public class Purchase {
@PersistenceContext
private EntityManager em;

@Autowired
private PurchaseDAO dao;

private String normalField;

.... // methods, operations, etc
}

如果我弄错了,请帮助纠正我:
  • 服务类 Purchase 和 PurchaseDAO 是由 spring
  • 管理的单例。
  • 服务类的字段 normalField 不是线程安全的,因为单例是许多
  • 共享的单个对象
  • 假设@Repository-annotated-PurchaseDAO 没有任何字段,这意味着它是线程安全的,将在spring
  • 自动注入(inject)
  • EntityManager 实例也是一个线程安全属性,因为@PersistenceContext 将确保将使用当前事务的 entityManager。

  • 谢谢 !

    最佳答案

  • 默认情况下它们是单例(当它们由 Spring 管理时),除非您以其他方式配置它们(从 xml 配置或使用注释,您可以使用 @Scope 设置它)。
  • 是和不是。是的,从多个线程可以同时访问和修改它的意义上说它是不安全的,并且不,因为它取决于数据类型并且 String 是不可变的(并且至少据说是线程安全的)。如果两个不同的线程同时尝试在成员变量中存储一个新字符串,它可能会崩溃。
  • 是的,又不是。如果 DAO 没有内部状态,是的,我会说它是线程安全的,但它正在处理的对象可能不是(尽管如果您使用的是 JPA 实体,它们应该是)。
  • 至少 Hibernate 的文档说 EntityManager 不是线程安全的,但是当使用 Spring 注入(inject)的 EntityManager 时,它应该不是问题。

  • SpringSource forums:
    我一直在论坛上寻找同一个问题的答案......普遍的共识似乎是,虽然 EntityManager 根据 JPA 规范不是线程安全的,但 Spring 通过其 EntityManager 代理注入(inject)的 EntityManager 可能是。

    Hibernate:
    EntityManager 是一个廉价的、非线程安全的对象,应该使用一次,用于单个业务流程、单个工作单元,然后丢弃。除非需要,否则 EntityManager 不会获取 JDBC 连接(或数据源),因此即使您不确定是否需要数据访问来服务特定请求,您也可以安全地打开和关闭 EntityManager。

    关于 Spring : @PersistenceContext and @Autowired thread safety?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5113716/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com