2010-07-22 62 views
2

我试图将Hibernate的批处理插入到Oracle中,根据我在这里阅读的内容:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html,但用我的基准测试它似乎没有比以前更快。带有休眠和oracle的批处理插入模式:似乎正在悄悄放回到慢速模式

任何人都可以提出一种方法来证明休眠是否使用批处理模式?我听说有很多原因可能会默默地进入正常模式(例如关联和生成的id),所以有什么方法可以找出它为什么没有成批?

我的hibernate.cfg.xml包含此行,我相信是所有我需要启用批模式:

<property name="jdbc.batch_size">50</property> 

我插入的代码如下所示:

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(); 

我“logentry”类没有关联,唯一有趣的字段是id:

@Entity 
@Table(name="log_entries") 
public class LogEntry { 
    @Id @GeneratedValue 
    public Long id; 
    ..other fields - strings and ints... 

但是,因为它是orac乐,我相信@GeneratedValue将使用sequence generator。我相信只有'身份证'发电机才会停止批量插入。

因此,如果任何人都可以解释为什么它不在批处理模式下运行,或者我可以确定它是否处于批处理模式,或者找出为什么hibernate会默默退回到慢速模式,我会非常感激。

感谢

+0

您链接的文档建议您按照批次大小冲洗。你可以试试。 您插入了多少条记录?只有100?这可能不是一个足够大的数字来真正看到性能改进。 – pkananen 2010-07-22 04:38:50

+0

我插入了250000条记录。我将它们分组到100个数组中,然后将它们传递给我的DAO(上面的插入代码)。所以我冲洗并清理每一百行。 – Chris 2010-07-22 04:41:05

+0

我改变log4j输出调试级别的日志,并看到这个“AbstractBatcher - 执行批量大小:96” - 这是否意味着我的批处理工作? – Chris 2010-07-22 04:56:29

回答

0

解决方案是去Log4j和启用调试级记录,然后查找:在thelog /控制台

AbstractBatcher - Executing batch size: * 

线。在我的情况下,它在在批处理模式下运行,它只是休眠真的很慢!

2

(...)但与我的基准测试,它似乎没有比以前更快。

以前是什么?你在测量什么?你改变了什么?我们该如何猜测?

任何人都可以提出一种方法来证明休眠是否使用批处理模式?在调试模式下

激活日志记录,在o.h.j.BatchingBatcher类 - 它是实际使用配料的Batcher接口的实现 - 记录这样的条目:

log.debug("Executing batch size: " + batchSize); 

你也许应该考虑使用改为StatelessSession

hibernate.temp.use_jdbc_metadata_defaults 

则不执行JDBC批处理:

+0

在Hibernate v4中,您现在可以在'org.hibernate.engine.jdbc.batch.internal.BatchingBatch' – Tadhg 2017-10-16 19:56:02

1

如果JDBC元使用禁用。这是休眠3.3.2.GA的情况。

0

你不是seing性能改进,因为:

来源:http://docs.oracle.com/cd/B28359_01/java.111/b31224/oraperf.htm

“Oracle里的实现标准更新的配料不 实施通用语句和可调用 报表真实配料虽然。 Oracle JDBC支持使用标准的 批处理Statement和CallableStatement对象,您不太可能在 中看到性能改进。“

如果你打开oracles自己的批处理,它打破休眠,因为更新计数不起作用。至少这是我发现的。