Java hibernate和oracle的批插入模式:似乎正在悄悄地回到慢速模式

Java hibernate和oracle的批插入模式:似乎正在悄悄地回到慢速模式,java,oracle,hibernate,Java,Oracle,Hibernate,根据我在这里读到的内容,我正在尝试将一个使用Hibernate的批插入到Oracle中,但是通过我的基准测试,它似乎没有比以前更快 有人能提出一种方法来证明hibernate是否使用批处理模式吗?我听说有很多原因可以解释它为什么会悄悄地进入正常模式(例如关联和生成的ID),那么有没有办法找出它为什么会变成非批处理 我的hibernate.cfg.xml包含以下行,我相信这就是启用批处理模式所需的全部内容: <property name="jdbc.batch_size">50<

根据我在这里读到的内容,我正在尝试将一个使用Hibernate的批插入到Oracle中,但是通过我的基准测试,它似乎没有比以前更快

有人能提出一种方法来证明hibernate是否使用批处理模式吗?我听说有很多原因可以解释它为什么会悄悄地进入正常模式(例如关联和生成的ID),那么有没有办法找出它为什么会变成非批处理

我的hibernate.cfg.xml包含以下行,我相信这就是启用批处理模式所需的全部内容:

<property name="jdbc.batch_size">50</property>
然而,由于它是oracle,我相信@GeneratedValue将使用。我相信只有“身份”生成器才能停止批量插入

因此,如果有人能解释为什么它没有在批处理模式下运行,或者我如何能确定它是否在批处理模式下运行,或者为什么hibernate会悄悄地返回到慢速模式,我将不胜感激


感谢

解决方案是转到log4j并启用调试级日志记录,然后查找:

AbstractBatcher - Executing batch size: *
日志/控制台中的行。在我的例子中,它是在批处理模式下运行的,只是Hibernate非常慢

(…)但我的基准测试似乎没有比以前更快

在什么之前?你在测量什么?你改变了什么?我们怎么能猜到呢

有人能提出一种方法来证明hibernate是否使用批处理模式吗

在调试模式下激活日志记录,
o.h.j.BatchingBatcher
类-它是实际使用批处理的
Batcher
接口的实现-记录如下条目:

List<LogEntry> entries = ..a list of 100 LogEntry data classes...
Session sess = sessionFactory.getCurrentSession();
for(LogEntry e : entries) {
  sess.save(e);
}
sess.flush();
sess.clear();
log.debug( "Executing batch size: " + batchSize );


您应该考虑使用<代码> SttalelEsScript < /C> > .< /P> < P>如果JDBC-meta被禁用:

hibernate.temp.use_jdbc_metadata_defaults

然后不执行jdbc批处理。hibernate 3.3.2.GA就是这种情况。

您没有获得性能改进,因为:

发件人:

“Oracle对标准更新批处理的实现没有 为泛型语句和可调用语句实现真正的批处理 即使Oracle JDBC支持使用标准 对语句和CallableStatement对象进行批处理,不太可能 看到性能的改进。”


如果您打开oracles自己的批处理,它会中断休眠,因为更新计数不起作用。至少我发现了这一点。

您链接的文档建议在达到批量大小时经常刷新。你可以试试。你要插入多少条记录?只有100?这可能不是一个足够大的数字,无法真正看到性能的提高。我总共插入了250000条记录。我将它们批处理成100个数组,然后将它们传递给我的DAO(上面的插入代码)。因此,我正在刷新和清除每100行。我将log4j更改为输出调试级日志,并看到“AbstractBatcher-执行批处理大小:96”-这是否意味着我的批处理正在工作?在Hibernate v4中,您现在可以在
org.Hibernate.engine.jdbc.batch.internal.BatchingBatch
hibernate.temp.use_jdbc_metadata_defaults