我试图将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会默默退回到慢速模式,我会非常感激。
感谢
您链接的文档建议您按照批次大小冲洗。你可以试试。 您插入了多少条记录?只有100?这可能不是一个足够大的数字来真正看到性能改进。 – pkananen 2010-07-22 04:38:50
我插入了250000条记录。我将它们分组到100个数组中,然后将它们传递给我的DAO(上面的插入代码)。所以我冲洗并清理每一百行。 – Chris 2010-07-22 04:41:05
我改变log4j输出调试级别的日志,并看到这个“AbstractBatcher - 执行批量大小:96” - 这是否意味着我的批处理工作? – Chris 2010-07-22 04:56:29