2016-07-17 84 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