【问题标题】:Best JPA ID Generation Strategy for Batch Insertion批量插入的最佳 JPA ID 生成策略
【发布时间】:2018-07-23 16:01:20
【问题描述】:

我在使用 Spring Data JPA 存储库一次插入 100 000 条记录时遇到问题。当我们执行repo.save(List<Objs>) 时,如果我们使用序列生成器会花费很多时间,因为它会在数据库中查询下一个值。我使用的是 Oracle,这里哪个 ID 生成最好?

【问题讨论】:

  • 你的序列生成器配置是什么?
  • Java 配置 @SequenceGenerator(name = "MY_SEQ_GEN", sequenceName = "MY_SEQ", allocationSize = 1) @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ_GEN") DB 序列:CREATE SEQUENCE MY_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 从1开始递增1;

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


【解决方案1】:

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

更多信息请参考Vlad Mihalcea的这篇文章

【讨论】:

    【解决方案2】:

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

    在您的特定情况下,我会先尝试分配大小,然后再尝试策略。 例如:JPA/Hibernate bulk inserts slow

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

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

    • SequenceHiLoGenerator 在休眠 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/

    【讨论】:

    • 使用 GUID 生成器怎么样?我认为这是最好的,根本不需要抓取序列,也不需要等待插入?
    猜你喜欢
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 2019-06-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    相关资源
    最近更新 更多