2016-07-17 86 views
0

嗯,我试图在JPA中进行批量插入,但我认为这不起作用。在Hibernate/JPA中使用批量插入

我的方法是这样的:

public void saveBatch(List<? extends AbstractBean> beans) { 
    try { 
     begin(); 
     logger.info("Salvando em batch " + beans.size() + " bean(s)"); 
     for (int i = 0; i < beans.size(); i++) { 
     if (i % 50 == 0) { 
      entityManager.flush(); 
      entityManager.clear(); 
     } 
     entityManager.merge(beans.get(i)); 

     } 
     commit(); 
    } catch (Exception e) { 
     logger.error("Ocorreu um erro ao tentar salvar batch. MSG ORIGINAL: " 
       + e.getMessage()); 
     rollback(); 
     throw new DAOException("Ocorreu um erro ao tentar salvar batch"); 
    } 
    } 

我IDEIA是,每50行Hibernate会令:

insert into tableA values(),(),()... 

但看日志,我看到一个INSERT每个合并()命令链接这样的:

insert into tableA values() 
insert into tableA values() 
insert into tableA values() 
insert into tableA values() 

有什么不对?这是对的 ?

+0

什么是您的JPA impl。这取决于。 你是否修改了JPA conf来启用它? 如果是,如何? – davidxxx

+0

我的jpa是2.1,使用hibernate。我没有修改任何jpa配置。 – RonaldoLanhellas

+0

可能的重复http://stackoverflow.com/questions/20285347/massive-insert-with-jpa-hibernate – Rob

回答

1

Hibernate默认情况下不启用批处理。您将要考虑以下settings(我觉得至少batch_size需要得到任何批量插入/更新工作):

hibernate.jdbc.batch_size 

非零值,允许使用JDBC2的批量更新休眠。例如 推荐值,如果在5和30之间

hibernate.jdbc.batch_versioned_data 

将此属性设置为true J​​DBC驱动程序返回正确的行从则ExecuteBatch 计数()。打开此选项通常是安全的。然后Hibernate将使用批量的DML来自动版本化数据。 默认为false。例如true |由 项目的主键值假

hibernate.order_updates (similarly, hibernate.order_inserts) 

强制休眠订购SQL更新进行更新。这将导致在高并发系统中更少的事务死锁 。例如true | false

+0

我的batch_size添加在persistente.xml,但问题仍然存在。我不明白为什么我应该使用这个属性,如果我控制它。 – RonaldoLanhellas