有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在游戏中插入大量实体!工作

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

模型

@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();
         }
    }
}

半小时后,数据库中仍然没有任何内容。但调试跟踪显示播放插入了一些内容。我怀疑这是某种缓存

我什么都试过了:

Model.em().flush();

什么都不会改变

Model.em().getTransaction().commit();

引发TransactionRequiredException:没有正在进行的事务

Model.em().setFlushMode(FlushModeType.COMMIT);
Model.em().setFlushMode(FlushModeType.AUTO);

什么都不会改变

我还尝试了@NoTransaction注释:

  • 类别及;控制器中的函数
  • 课堂案例
  • 在模型中重写save方法
  • 类别及;我的工作职能

变得非常绝望。欢迎提出各种建议

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


共 (3) 个答案

  1. # 1 楼答案

    根据documentation,作业应该像播放请求一样启用自己的事务,所以这不是问题所在。尝试这样做:

    for (int i = 0; i !=) {
    
      // Somestuff
    
      Case tmp = new Case(someString);
      tmp = JPA.em().merge(tmp);
      tmp.save();
    }
    

    其思想是在保存之前将新创建的对象显式添加到EntityManager,确保该对象是将被持久化的“脏对象”的一部分

  2. # 2 楼答案

    试一试

    em.getTransaction().begin();
    em.persist(model);
    em.getTransaction().commit();
    

    在开始事务之前,不能提交它

  3. # 3 楼答案

    你需要指导游戏!当它应该通过使用以下注释之一@OnApplicationStart、@Every或@On来注释类来运行作业时

    请检查播放!关于jobs的文件