如何在休眠中启用批量插入?

时间:2012-08-17 18:35:35

标签: java database performance hibernate batch-processing

使用hibernate,当我尝试使用

启用批量插入时
  <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

我错过了一个设置吗?

2 个答案:

答案 0 :(得分:12)

enable batching for both INSERT and UPDATE statements,您需要设置以下所有Hibernate属性:

<property name="hibernate.jdbc.batch_size">30</property>
<property name="hibernate.order_inserts">true</property>
<property name="hibernate.order_updates">true</property>
<property name="hibernate.jdbc.batch_versioned_data">true</property>

如果您可以使用SEQUENCE,那么您不应该使用IDENTITY生成器,因为it disables batch fetching

如果你不能使用SEQUENCE(例如MySQL),那么尝试使用单独的机制来启用批量插入(例如jOOQ),而不是使用TABLE generator which does not scale and has a high-performance penalty

答案 1 :(得分:5)

原来在这个案例中缺少的是:

<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类型连接字符串也可能以某种方式相关。

https://forum.hibernate.org/viewtopic.php?p=2374413也看到了 Hibernate batch size confusion