2012-03-24 84 views
3

可以说我有三份工作当​​前正在运行,其中两个是相同的......所以:做工作共享EntityManagers - 玩!框架

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中查看数据库中的实体/模型对象,那么job2/job3很可能会因为对象刚刚脱离会话而中断?

同样,可以说我做JOB1如下:

long id = 123 
User user1 = new User(id); 
user1.save(); 

然后在作业2或作业3我做的:

User user2 = User.findById(id); 

将用户2等于“空”或者等于“ USER1" ?这意味着,即使user1尚未刷新/提交到数据库,job2或job3是否能够通过Id查找它?

我认为这两个问题都是在于乔布斯(无论他们是否是同一个工作实例或不同的工作)共享EntityManagers,因此.em()。flush(),.em()。 clear()或.em()。getTransaction()。commit()或Model.save()会同时影响所有作业?

回答

3

作业启动他们自己的jpa事务,并且实体在事务完成之前不会实际持久化。

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

如果你想提交,同时jobs1数据仍然在运行,你可以在JOB1提交事务,并开始像一个新问题:

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

比方说JOB1和作业2(同一作业的2个实例)在称为processQueue()的'doJob()'中调用相同的方法。因此,如果在'processQueue(){}'我做'JPA.em()。getTransaction',你说一个不同的交易将被返回,取决于job1或job2是否称为processQueue?同样,这听起来像你所说的,在job1中执行'JPA.em()。clear'将不会影响job2中当前可能连接的实体。在你提供的例子中也有 – HelpMeStackOverflowMyOnlyHope 2012-03-25 13:36:14

+0

,你为什么在JPA.em().getTransaction()。commit()之后做JPA.em()。flush()? commit()不会与数据库刷新/同步所有数据已经​​可以写出来吗? – HelpMeStackOverflowMyOnlyHope 2012-03-25 13:37:45

+0

感谢您的答复,我有很多需要立即保存的实体。所以我把这段代码放入一个无效名称“saveEntities”中,并从任何需要更新的地方调用它。 – dreampowder 2012-11-21 11:34:53