如何在Play中插入大量实体!工作?

时间:2011-06-15 22:26:34

标签: java jpa transactions batch-file playframework

在我的应用程序中,我必须模拟各种情况进行分析。因此,将(非常)大量的行插入数据库。 (我们谈论的是非常大量的数据......数十亿)

模型

@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 注释:

  • Class&控制器中的功能
  • Class Case
  • 覆盖模型
  • 中的保存方法
  • Class&我职务的功能

非常绝望。欢迎各种建议。

编辑:经过一番研究,第一行出现在数据库中。相关ID约为550.000。这意味着我的应用程序和数据库之间大约有50万行。

3 个答案:

答案 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

的文档