在我的应用程序中,我必须模拟各种情况进行分析。因此,将(非常)大量的行插入数据库。 (我们谈论的是非常大量的数据......数十亿)
@Entity
public class Case extends Model {
public String url;
}
public class Simulator extends Job {
public void doJob() {
for (int i = 0; i !=) {
// Somestuff
new Case(someString).save();
}
}
}
半小时后, 数据库中仍然没有任何内容 。但调试跟踪显示Play插入一些东西。我怀疑它是某种缓存。
我尝试了一切:
Model.em().flush();
什么都不改变。
Model.em().getTransaction().commit();
throws 发生TransactionRequiredException:没有正在进行的交易
Model.em().setFlushMode(FlushModeType.COMMIT);
Model.em().setFlushMode(FlushModeType.AUTO);
什么都不改变。
我还尝试过 @NoTransaction 注释:
非常绝望。欢迎各种建议。
编辑:经过一番研究,第一行出现在数据库中。相关ID约为550.000。这意味着我的应用程序和数据库之间大约有50万行。
答案 0 :(得分:3)
尝试
em.getTransaction().begin();
em.persist(model);
em.getTransaction().commit();
在开始之前,您无法提交交易。
答案 1 :(得分:0)
根据documentation,作业应该像Play请求一样启用自己的事务,这不是问题所在。试着这样做:
for (int i = 0; i !=) {
// Somestuff
Case tmp = new Case(someString);
tmp = JPA.em().merge(tmp);
tmp.save();
}
我们的想法是在保存之前将新创建的对象显式添加到EntityManager,确保该对象是将被保留的“脏对象”的一部分。
答案 2 :(得分:-1)
你需要指导游戏!当它应该通过使用其中一个注释@OnApplicationStart,@ Every或@On来注释你的课程来运行你的工作。
请检查播放!关于jobs
的文档