【发布时间】:2015-11-05 03:29:50
【问题描述】:
我有几个客户想要使用 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 收割,因此大客户的所有导入都失败了。 我已经将事务超时增加到一小时,进一步增加对我来说没有解决办法。
此时我可以做些什么来提高休眠更新性能?
【问题讨论】:
-
每 25 件物品上的刷新似乎是问题所在。在每次刷新时,会话都会与数据库同步。你试过没有吗?
-
就个人而言,对于 600k 行,我非常倾向于绕过 Hibernate 并在 SQL 级别进行批量 upsert/merge。
标签: hibernate postgresql jakarta-ee