Hibernate批量插入。它会使用一个插入而不是多个插入吗?

时间:2011-05-29 07:53:23

标签: java oracle hibernate batch-file

我一直在寻找确定一些我不确定的Hibernate行为。在正确设置Hibernate批处理的情况下,它是否只在发送批处理时使用多个插入语句?是否无法使用DB独立的多插入语句?

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

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

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

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

4 个答案:

答案 0 :(得分:8)

Hibernate使用多个insert语句(每个实体插入一个),但是以批处理方式将它们发送到数据库(使用Statement.addBatch()Statement.executeBatch())。这就是您在日志中看到多个insert语句的原因,也是“执行批量大小:25”的原因。

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

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

答案 1 :(得分:2)

我知道这是一个老问题,但我有同样的问题,我认为hibernate批处理意味着hibernate会将多个插入组合成一个它似乎不会做的语句。

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

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

因此,毕竟hibernate批处理似乎没用,真正的多行插入要好得多。我做错了什么或导致我的测试结果是什么?

答案 2 :(得分:1)

Oracle批量插入收集一个entyty数组,并将单个块传递给与其关联的单独的ciclic插入/更新/删除。

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

Oracle建议从hibernate调用存储过程传递一个数据数组。

答案 3 :(得分:0)

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

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