工作分享EntityManagers - 玩!骨架

时间:2012-03-24 17:43:09

标签: multithreading hibernate playframework jobs entitymanager

假设我现在有三个乔布斯正在运行,其中两个是相同的......所以:

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是否容易中断,因为Object刚刚从会话中分离出来?

同样,假设我在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()。清除()或.em()。getTransaction()。commit()OR Model.save()会同时影响所有作业吗?

1 个答案:

答案 0 :(得分:3)

作业开始自己的jpa交易,在交易完成之前,您的实体实际上不会被持久化。

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

如果你想在jobs1仍在运行时提交数据,你可以在job1中提交事务并开始一个新的事务,例如:

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