我一直在寻找确定一些我不确定的Hibernate行为。在正确设置Hibernate批处理的情况下,它是否只在发送批处理时使用多个插入语句?是否无法使用DB独立的多插入语句?
我想我正在尝试确定我是否确实正确设置了批处理。我看到多个insert语句,但后来我也看到“执行批量大小:25”这一行。
我可以发布很多代码,但我试图保持这种一般性。所以,我的问题是:
1)您可以在日志中读到什么以确定正在使用批处理?
2)是否可以使Hibernate使用多行插入而不是多个插入语句?
答案 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利用率方面在应用程序和数据库之间传输的数据