Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring:@PersistenceContext和@Autowired线程安全性?_Spring_Jpa_Jpa 2.0 - Fatal编程技术网

Spring:@PersistenceContext和@Autowired线程安全性?

Spring:@PersistenceContext和@Autowired线程安全性?,spring,jpa,jpa-2.0,Spring,Jpa,Jpa 2.0,基于此示例: @Service public class Purchase { @PersistenceContext private EntityManager em; @Autowired private PurchaseDAO dao; private String normalField; .... // methods, operations, etc } 如果我弄错了,请帮我纠正: 服务类PurchaseDAO和PurchaseDAO是由spring管

基于此示例:

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

  @Autowired
  private PurchaseDAO dao;

  private String normalField;

  .... // methods, operations, etc
}
如果我弄错了,请帮我纠正:

  • 服务类PurchaseDAO和PurchaseDAO是由spring管理的单例
  • 服务类的字段normalField不是线程安全的,因为singleton是由多个用户共享的单个对象
  • 假设@Repository注释的PurchaseDAO没有任何字段,这意味着它的线程安全性将由spring自动注入
  • EntityManager实例也是线程安全属性,因为@PersistenceContext将确保使用当前事务的EntityManager
  • 谢谢大家!

  • 默认情况下,它们是单例(当它们是Spring管理的时),除非您以其他方式配置它们(通过xml配置或注释,您可以使用@Scope进行设置)
  • 是和否。是的,多个线程可以同时访问和修改它是不安全的,否是因为它取决于数据类型,并且字符串是不可变的(至少可以说是线程安全的)。如果两个不同的线程试图在同一时刻在成员变量中存储一个新字符串,它可能会崩溃
  • 又是又不是。如果DAO没有内部状态,是的,我会说它是线程安全的,但是它处理的对象可能不是(尽管如果您使用的是JPA实体,它们应该是)
  • 至少Hibernate的文档说EntityManager不是线程安全的,但是当使用Spring注入的EntityManager时,这不应该是一个问题
  • 我一直在论坛上寻找同一个问题的答案。。。一般的共识似乎是,虽然EntityManager不是JPA规范中的线程安全的,但是Spring通过其EntityManager代理注入的EntityManager可能是安全的


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

    2。拥有非final类属性不总是使类非线程安全吗?我的意思是,尽管属性类型(String)是不可变的,但属性仍然可以更改为指向不同的对象(另一个String实例)。这难道不会导致类变得完全不线程安全吗?是的,尽管这取决于成员变量(类属性)的访问、修改和使用方式,但一般来说,我想说的是,是否有可能同时从两个不同的线程修改同一个变量,或者在被另一个修改时被另一个访问,这会使类不是线程安全的。使用同步或仅读取变量(或者在本例中,字符串引用或整个字符串可以在使用前复制到类外的另一个引用),同时访问不应该引起任何问题,因此类应该是线程安全的。嘿@bertie,我使用的是
    @PersistenceContext
    方法。但这似乎造成了内存泄漏。因为会话不清楚。你有过类似的经历吗?@oak:对不起,我自己也不确定,因为我已经很久没有和JPA一起玩了。我建议您为您的问题和环境创建一个新的问题,在这里放置
    @PersistenceContext
    ,等等。