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