【问题标题】:How do you enable batch inserts in hibernate?如何在休眠中启用批量插入?
【发布时间】:2012-08-14 05:30:57
【问题描述】:

使用休眠,当我尝试启用批量插入时

  <property name="jdbc.batch_size">50</property>

我得到以下输出:

 [...] cfg.SettingsFactory INFO  - JDBC batch updates for versioned data: disabled
 [...] cfg.SettingsFactory INFO  - Order SQL inserts for batching: disabled

然后是这个:

 [...] jdbc.AbstractBatcher DEBUG - Executing batch size: 1

基本上不会超过batch size: 1

我是否缺少设置?

【问题讨论】:

    标签: java database performance hibernate batch-processing


    【解决方案1】:

    要为 INSERT 和 UPDATE 语句启用批处理,您需要设置以下所有 Hibernate 属性:

    spring.jpa.properties.hibernate.jdbc.batch_size=30
    spring.jpa.properties.hibernate.order_inserts=true
    spring.jpa.properties.hibernate.order_updates=true
    

    如果您可以使用SEQUENCE,那么您不应使用IDENTITY 实体标识符生成器,​​因为它会禁用批量获取。

    如果您不能使用SEQUENCE(例如MySQL),那么请尝试使用单独的机制来启用批量插入(例如JDBC),而不是使用TABLE 生成器,因为它无法扩展并且具有高性能损失。

    【讨论】:

      【解决方案2】:

      原来在这种情况下缺少的是:

      <property name="order_inserts">true</property>
      

      参考:https://forum.hibernate.org/viewtopic.php?p=2374413, https://stackoverflow.com/a/5240930/32453 或者可能是 hibernate.order_inserts。

      现在我明白了

       [...] cfg.SettingsFactory INFO  - Order SQL inserts for batching: enabled
       ...
       [...] Executing batch size: 2
      

      更频繁(任何大于 1 的值基本上意味着它正在成功地进行批量插入)。

      hibernate.jdbc.batch_versioned_data 也可能有用。

      jdbc:mysql://localhost:3306/batch?rewriteBatchedStatements=true 类型的连接字符串也可能以某种方式相关。

      https://forum.hibernate.org/viewtopic.php?p=2374413 并参见 Hibernate batch size confusion

      【讨论】:

      • 这不是 100% 正确的:即使批量大小为 1 也意味着 Hibernate 正在使用 JDBC 的批处理 API,并且我已经对此进行了测试,它的速度比即使大小为 1 的常规 API。使用 Oracle 和 Postgresql 测试。
      • 好的,我想这意味着最初对我来说批处理是“打开的”,但没有其他情况下那么有效。很高兴知道。
      猜你喜欢
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 2012-11-18
      • 2020-09-26
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多