一尘不染

为什么要刷新的对象数应等于hibernate.jdbc.batch_size?

hibernate

正如hibernate文档所述,在进行批处理插入/更新时,当对象数量等于jdbc批处理大小(hibernate.jdbc.batch_size)时,应刷新并清除会话。我的问题是,为什么该数字应等于hibernate.jdbc.batch_size。有表演技巧吗?
编辑:
例如,我hibernate.jdbc.batch_size在hibernate.cfg文件中将其设置为30。然后,正如文档所说,当对象计数等于30时,应刷新会话。为什么当对象计数为20或40时不刷新?


阅读 288

收藏
2020-06-20

共1个答案

一尘不染

JDBC批处理包括以下步骤:

  • 将插入语句添加到批处理中,保存在内存中
  • 当您达到了批处理中记录的给定数量的插入语句时(或不再有要执行的插入语句时),请在一次网络往返中将此批处理命令发送到数据库,以便数据库实际执行这些操作插入语句。

刷新会话包括告诉Hibernate:将内存中保留的所有内容都插入数据库。

因此,如果您的批处理大小设置为30,并且每5个实体刷新一次,则Hibernate将执行很多小批处理,每个批处理包含5条插入语句,而不是少执行6批30条语句。由于您确定30为最佳批处理大小,因此每5个实体进行刷新不会使用此最佳大小。

相反,如果刷新每个35个实体,则Hibernate将执行一批30次插入,然后一批5次,然后一批30次,然后批5次,依此类推。再次,您不是使用最佳批次大小。

如果您每30个实体刷新一次,则hibernate状态将仅执行最佳大小的批处理,如果最后一个实体的总数不是30的倍数,则hibernate模式除外。

2020-06-20