【问题标题】:Hibernate Performance flush v commit休眠性能刷新 v 提交
【发布时间】:2011-07-28 05:50:23
【问题描述】:

我正在创建一个休眠组件来与大量传入数据交互以持久保存,包括保存(创建)和更新数百万行的数据。

我知道 flush v commit 的主要区别,例如将“脏”数据刷新同步到可持久的底层数据中,并且刷新允许您在不实际提交的情况下与底层的可持久数据同步,以便事务可以如果需要,可以回滚。 Commit 本质上是将所有可持久化的数据提交到数据库。

我正在创建一个休眠组件来与大量传入数据交互以持久保存,包括保存(创建)和更新数百万行的数据。

我知道 flush v commit 的主要区别,例如将“脏”数据刷新同步到可持久的底层数据中,并且刷新允许您在不实际提交的情况下与底层的可持久数据同步,以便事务可以如果需要,可以回滚。 Commit 本质上是将所有可持久化的数据提交到数据库。

批量插入的合理尺寸是多少? 50 是合理性能的最大数量,例如:

for (i < 1000000)
    if(i % 50 ) {
        session.flush()
    }

我收集到 50 应该与 hibernate.jdbc.batch_size 50 中的值匹配

【问题讨论】:

    标签: performance hibernate commit flush


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2010-11-13
      相关资源
      最近更新 更多