假设我有三个作业正在运行,其中两个是相同的……所以:
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中传递一个entity/Model对象,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来查找它?
我认为这两个问题的意思是,作业(不管它们是相同作业的实例化还是不同作业的实例化)是否共享EntityManagers,因此.em().flush()、.em().clear()或.em().getTransaction().commit()或Model.save()将同时影响所有作业?
发布于 2012-03-25 12:27:08
作业开始它们自己的jpa事务,而您的实体在事务完成之前实际上不会被持久化。
因此,除非作业1在job2加载实体时完成,否则job2不会看到job1所做的更改。
如果您想要在jobs1仍在运行时提交数据,您可以在job1中提交事务,然后使用如下代码启动一个新事务:
JPA.em().getTransaction().commit();
JPA.em().getTransaction().begin();
JPA.em().flush();
JPA.em().clear();
https://stackoverflow.com/questions/9853968
复制相似问题