插入大量行而不将实体附加到持久性上下文

时间:2016-09-24 19:34:45

标签: java spring spring-boot spring-data spring-data-jpa

在“数据提供者”上流式传输时,我需要在数据库中插入相当多的实体,比如大约100.000。整个步骤需要交易 为了尽可能地简化我的用例,我们假设这是我的代码:

EntityManager

这段代码的问题在于,即使很明显我在生成插入查询后没有使用Car实体,实体附加到持久化上下文并保留在内存中直到事务完了。
我想确保在触发垃圾收集的情况下清除创建的实体。目前我看到两个解决方案:

  • 在存储库上创建本机插入查询
  • 在服务中注入em.detach(car),并在每次插入后调用{{1}}

我倾向于选择第二个选项,因为在实体更改时我不必管理本机插入语句。

您能否确认我采取了正确的方法或提出了更好的选择?

2 个答案:

答案 0 :(得分:2)

您可以在Hibernate documentation中找到插入数据批量的方式。

  

在使新对象持久化flush()然后清除()会话时,为了控制第一级缓存的大小。

因此建议采用以下方法:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    session.save(new Car());
    if (i%20 == 0 ) {
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close(); 

答案 1 :(得分:0)

您可以尝试使用spring数据JPA saveAndFlush(S entity)而不是save()

中的JpaRepository方法