可以说我当前正在运行三个作业,其中两个是相同的...因此:

CrawlJob job1 = new CrawlJob();
CrawlJob job2 = new CrawlJob();
CurrentJob job3 = new CurrentJob();
job1.now()
job2.now()
job3.now()

如果我在job1中执行以下操作:
JPA.em().flush();
JPA.em().clear();

这还会分离出job2和job3当前正在处理的所有实体吗?意思是如果我要在数据库中查找的job2/job3中传递一个实体/模型对象,由于该对象刚从 session 中分离出来,job2/job3是否容易中断?

同样,可以说我在job1中执行以下操作:
long id = 123
User user1 = new User(id);
user1.save();

然后在job2或job3中我这样做:
User user2 = User.findById(id);

user2等于“null”还是等于“user1”?意思是,即使尚未将user1刷新/提交到数据库,job2或job3能否通过ID查找它?

我认为这两个问题正在解决的是Jobs(无论它们是同一Job的实例还是不同Job的实例化)是否共享EntityManagers并因此共享.em()。flush()、. em()。clear()或.em()。getTransaction()。commit()或Model.save()是否会同时影响所有Job?

最佳答案

作业将开始他们自己的jpa事务,并且在事务完成之前,您的实体实际上不会持久化。

因此,除非在job2加载实体时Job 1完成,否则job2将看不到job1所做的更改。

如果您想在job1仍在运行时提交数据,则可以在job1中提交事务,并使用类似以下内容的方法启动一个新事务:

    JPA.em().getTransaction().commit();
    JPA.em().getTransaction().begin();
    JPA.em().flush();
    JPA.em().clear();

10-06 06:50