我创建一个hibernate组件来与大型传入数据进行交互以保持持久性,同时使用数百万行的卷保存(创建)和更新数据。
我知道有关flush v commit的主要区别,例如将“脏”数据刷新同步到可持久的底层数据,而flush可以让你与底层的可持久数据同步,而无需实际提交,以便事务可以如果需要,可以回滚。 Commit实质上将所有可持久数据提交到数据库。
我创建一个hibernate组件来与大型传入数据进行交互以保持持久性,同时使用数百万行的卷保存(创建)和更新数据。
我知道有关flush v commit的主要区别,例如将“脏”数据刷新同步到可持久的底层数据,而flush可以让你与底层的可持久数据同步,而无需实际提交,以便事务可以如果需要,可以回滚。 Commit实质上将所有可持久数据提交到数据库。
批量插入的大小合理吗? IS 50是合理性能的最大数量,如下所示:
for (i < 1000000)
if(i % 50 ) {
session.flush()
}
我收集50应与hibernate.jdbc.batch_size 50
答案 0 :(得分:1)
这取决于您的数据。批处理大小是休眠将在其会话上保留的项目数量之间的平衡,以及进行到数据库进行刷新往返所涉及的延迟。如果您的批量太小,您最终会向数据库进行许多往返。如果你的批量太大,你最终会在hibernate的会话中持有很多对象 - 如果你的对象很胖,这可能是个问题。
我会说50是一个较低的数字:1M / 50 = 20000
往返。我会说你从一个更大的数字开始并测量性能。顺便说一下,这仅适用于批处理操作:hibernate.jdbc.batch_size
是50用于常规应用程序事务。
PS不要忘记在刷新后清除hibernate会话,否则即使在刷新后,hibernate也会将持久化对象保存在内存中。