[英]Using batch insert in Hibernate/JPA
好吧,我正在嘗試在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");
}
}
我的想法是,休眠的每50行將產生:
insert into tableA values (),(),()...
但是看着日志,我看到每個merge()命令的一個INSERT鏈接如下:
insert into tableA values ()
insert into tableA values ()
insert into tableA values ()
insert into tableA values ()
怎么了 ? 這是對的 ?
Hibernate默認情況下不啟用批處理。 您將需要考慮以下設置 (我認為至少需要batch_size
才能使任何批處理插入/更新工作):
hibernate.jdbc.batch_size
非零值允許Hibernate使用JDBC2批處理更新。 例如建議值介於5到30之間
hibernate.jdbc.batch_versioned_data
如果您的JDBC驅動程序從executeBatch()返回正確的行數,則將此屬性設置為true。 通常可以安全地打開此選項。 然后,Hibernate將使用批處理的DML來自動版本化數據。 默認為false。 例如,真| 假
hibernate.order_updates (similarly, hibernate.order_inserts)
強制Hibernate通過要更新的項目的主鍵值對SQL更新進行排序。 這將導致高度並發的系統中更少的事務死鎖。 例如,真| 假
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.