Hibernate Performance flush v commit

时间:2011-04-02 12:21:29

标签: performance hibernate commit flush

我创建一个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

中的值匹配

1 个答案:

答案 0 :(得分:1)

这取决于您的数据。批处理大小是休眠将在其会话上保留的项目数量之间的平衡,以及进行到数据库进行刷新往返所涉及的延迟。如果您的批量太小,您最终会向数据库进行许多往返。如果你的批量太大,你最终会在hibernate的会话中持有很多对象 - 如果你的对象很胖,这可能是个问题。

我会说50是一个较低的数字:1M / 50 = 20000往返。我会说你从一个更大的数字开始并测量性能。顺便说一下,这仅适用于批处理操作:hibernate.jdbc.batch_size是50用于常规应用程序事务。

PS不要忘记在刷新后清除hibernate会话,否则即使在刷新后,hibernate也会将持久化对象保存在内存中。