在“数据提供者”上流式传输时,我需要在数据库中插入相当多的实体,比如大约100.000。整个步骤需要交易 为了尽可能地简化我的用例,我们假设这是我的代码:
EntityManager
这段代码的问题在于,即使很明显我在生成插入查询后没有使用Car实体,实体附加到持久化上下文并保留在内存中直到事务完了。
我想确保在触发垃圾收集的情况下清除创建的实体。目前我看到两个解决方案:
em.detach(car)
,并在每次插入后调用{{1}} 我倾向于选择第二个选项,因为在实体更改时我不必管理本机插入语句。
您能否确认我采取了正确的方法或提出了更好的选择?
答案 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
方法