如何在休眠状态下启用批处理插入?

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

  <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

我是否缺少设置?


答案 1

若要同时为 INSERT 语句和 UPDATE 语句启用批处理,需要设置以下所有休眠属性:

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

如果可以使用 ,则不应使用实体标识符生成器,因为它会禁用批量提取。SEQUENCEIDENTITY

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


答案 2

事实证明,在这种情况下缺少的是:

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

参考:https://forum.hibernate.org/viewtopic.php?p=2374413https://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 type 连接字符串也可能以某种方式相关。

https://forum.hibernate.org/viewtopic.php?p=2374413,另请参阅休眠批大小混淆


推荐