用于批量插入的最佳JPA ID生成策略

时间:2018-02-13 10:10:13

标签: java oracle hibernate jpa spring-data-jpa

使用spring数据JPA存储库同时插入100 000条记录时遇到问题。当我们执行repo.save(List<Objs>)时,如果我们使用序列生成器来查询数据库中的nextval,则需要花费很多时间。我正在使用Oracle,这里的ID生成最好吗?

2 个答案:

答案 0 :(得分:1)

allocationSize=1是这里的真正问题。使用此配置,休眠将为每个插入调用nextVal(),因此,如果您有1000个插入,则休眠将调用nextVal() 1000次。

有关更多信息,请参考Vlad Mihalcea

答案 1 :(得分:0)

序列生成器可能是一个不错的选择,但您必须调整其参数。

在您的特定情况下,我开始尝试分配大小,然后使用策略。 例如,请参阅:JPA/Hibernate bulk inserts slow

看看优化器配置: https://vladmihalcea.com/hibernate-hidden-gem-the-pooled-lo-optimizer/

请注意,您的配置解析为:

  • SequenceHiLoGenerator关于Hibernate 4
  • SequenceStyleGenerator关于Hibernate 5,(hibernate.id.new_generator_mappings设置为true)

您不能使用身份生成器(请参阅Hibernate disabled insert batching when using an identity identifier generator

表生成器不是性能最佳的(https://vladmihalcea.com/why-you-should-never-use-the-table-identifier-generator-with-jpa-and-hibernate/

此外,请确保nextval()的数量是实际问题。 也许更改批量大小或语句顺序会有所帮助(参见https://vladmihalcea.com/how-to-batch-insert-and-update-statements-with-hibernate/