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

时间:2014-08-21 03:54:19

标签: hibernate jdbc batch-processing

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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