好吧,我正在尝试在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 ()
有什么问题?这是对的吗?
答案 0 :(得分:1)
默认情况下,Hibernate不启用批处理。您将需要考虑以下settings(我认为至少需要batch_size
才能使任何批量插入/更新生效):
hibernate.jdbc.batch_size
非零值允许Hibernate使用JDBC2批量更新。例如 建议值介于5到30之间
hibernate.jdbc.batch_versioned_data
如果JDBC驱动程序返回正确的行,请将此属性设置为true 从executeBatch()开始计算。打开此选项通常是安全的。 然后,Hibernate将使用批处理的DML来自动生成版本的数据。 默认为false。例如是的|假
hibernate.order_updates (similarly, hibernate.order_inserts)
强制Hibernate按主键值排序SQL更新 正在更新的项目。这将导致更少的事务死锁 在高度并发的系统中。例如是的|假