我有几个客户想要使用 CSV 文件更新他们的数据,典型客户的文件有 1.000 到 20.000 行。
解析行后,我将新数据合并到现有实体中。使用批量保存来保存所有已修改的实体:
public void batchSaveOrUpdate(List<Item> items) {
Transaction transaction = session.beginTransaction();
List<Item> itemsToEvict = new ArrayList<>();
int count = 0;
for (Item item : itemss) {
session.saveOrUpdate(item);
itemsToEvict.add(item);
if (count++ % 25 == 0) {
session.flush();
itemsToEvict.forEach(session::evict);
itemsToEvict.clear();
}
}
transaction.commit();
session.flush();
}
它适用于最多 25.000 行的正常导入,但现在我有一个客户,其 CSV 文件最多包含 600.000 行。 即使在确定已修改的项目后,也有 100.000 多个实体同时更新。 由于 WildFly 会在一段时间后收割所有交易,因此大客户的所有进口都会失败。 我已经将事务超时增加到一小时,进一步增加对我来说不是解决方案。
此时我可以做些什么来提高 hibernate 更新性能?
最佳答案
您可以尝试编写自己的存储过程。 Hibernate 不是您需要的最佳选择..
关于Hibernate 如何有效地处理 100.000+ 个实体更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31966624/