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

pra*_*eth 3 hibernate jdbc batch-processing

正如hibernate 文档所说,当进行批量插入/更新时,当对象数量等于 jdbc 批量大小 ( hibernate.jdbc.batch_size)时,会话应该被刷新和清除。我的问题是为什么这个数字应该等于hibernate.jdbc.batch_size. 有性能提示吗?
编辑: 例如,认为我hibernate.jdbc.batch_size在 hibernate.cfg 文件中将 设置为 30。然后正如文档所说,当对象计数等于 30 时应该刷新会话。为什么我不应该在对象计数为 20 或 40 时刷新?

JB *_*zet 6

JDBC 批处理包括执行以下操作:

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

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

因此,如果您的批次大小设置为 30,并且您每刷新 5 个实体,Hibernate 将执行大量 5 个插入语句的小批次,而不是执行 30 个语句的 6 倍的批次。由于您已确定 30 是最佳批量大小,因此每 5 个实体刷新一次不会使用此最佳大小。

相反,如果你每 35 个实体刷新一次,那么 Hibernate 将执行一批 30 个插入,然后一批 5,然后一批 30,然后一批 5,等等。再一次,你不是使用最佳批量大小。

如果每 30 个实体刷新一次,那么 hibernate 将只执行最佳大小的批处理,如果实体总数不是 30 的倍数,则最后一个除外。