【问题标题】:Hibernate Batch Insert. Would it ever use one insert instead of multiple inserts?休眠批量插入。它会使用一个插入而不是多个插入吗?
【发布时间】:2011-05-29 07:53:22
【问题描述】:

我一直在环顾四周,试图确定一些我不确定的 Hibernate 行为。在正确设置 Hibernate 批处理的情况下,它是否只会在发送批处理时使用多个插入语句?难道不能使用独立于DB的多插入语句吗?

我想我正在尝试确定我是否真的正确设置了批处理。我看到了多个插入语句,但随后我也看到了“执行批量大小:25”这一行。

我可以发布很多代码,但我试图保持一般性。所以,我的问题是:

1) 您可以从日志中读取什么来确定正在使用批处理?

2) 是否可以让 Hibernate 使用多行插入而不是多插入语句?

【问题讨论】:

  • 我实际上会访问数据库以查看幕后发生的事情。 SqlServer 有一个分析器,它可以告诉你几乎所有的事情。使用 Oracle,您将需要访问 v$sql 对象。 link
  • 我做到了,据我所知,它只使用过插入语句。我确实在某处读到过休眠日志具有误导性,但我认为这是因为该特定示例使用的是 MySQL,它有一个 rewriteBatchedStatements 选项可以完成工作(我使用的是 Oracle)。

标签: java oracle hibernate batch-file


【解决方案1】:

Hibernate 使用多个插入语句(每个要插入的实体一个),但以批处理模式将它们发送到数据库(使用Statement.addBatch()Statement.executeBatch())。这就是您在日志中看到多个插入语句以及“Executing batch size: 25”的原因。

批处理语句的使用大大减少了到数据库的往返次数,如果它比执行具有多个插入的单个语句的效率低,我会感到惊讶。此外,它还允许混合更新和插入,例如,在单个数据库调用中。

我很确定不可能让 Hibernate 使用多行插入,但我也很确定它没有用。

【讨论】:

  • 酷,这让我放心。我认为这就是它的工作方式,但我没有意识到批处理语句可能与单个语句插入一样好。谢谢。
【解决方案2】:

我知道这是一个老问题,但我遇到了同样的问题,我认为休眠批处理意味着休眠会将多个插入组合到一个语句中,而它似乎没有这样做。

经过一些测试,我发现这个答案是一批多个插入与多行插入一样好。我做了一个测试,一次使用休眠批处理插入 1000 行,一次不使用。两项测试都花费了大约 20 秒,因此使用休眠批处理没有性能提升。

为了确保我尝试使用 MySQL Connector/J 中的 rewriteBatchedStatements 选项,该选项实际上将多个插入组合到一个语句中。它将插入 1000 条记录的时间缩短到 3 秒。

所以毕竟休眠批处理似乎没用,真正的多行插入要好得多。我做错了什么还是什么导致了我的测试结果?

【讨论】:

    【解决方案3】:

    Oracle 批量插入收集一个实体数组,并将单个块传递给与它相关联的 db 一个 unic ciclic 插入/更新/删除。

    是加快网络吞吐量的唯一方法。

    Oracle 建议从休眠中调用一个存储过程,并传递一个数据数组。

    【讨论】:

      【解决方案4】:

      http://biemond.blogspot.it/2012/03/oracle-bulk-insert-or-select-from-java.html?m=1 不仅是软件问题,而且是基础设施问题! 问题是网络数据流优化和 TCP 堆栈碎片。 mysql有功能。 您必须执行类似于本文中描述的操作。 在网络上正常传输正确的数据量是解决方案

      您还必须验证网络 mtu 和 Oracle sdu/tdu 利用率方面的应用程序和数据库之间传输的数据

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-26
        • 2015-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多