gpt4 book ai didi

java - Hibernate Mass 插入/更新 : is this a good approach?

转载 作者:搜寻专家 更新时间:2023-10-31 20:29:49 24 4
gpt4 key购买 nike

我目前正在我们基于 hibernate 的应用程序中进行性能和内存调整,以进行大批量/批量导入。我们基本上是导入一个包含产品数据的 CSV 文件,其中一些产品是新的(插入),一些存在(更新)。

我现在的重点是选择一种策略来找出要更新哪些实体以及要插入哪些实体,而无需对 CSV 文件中的每一行进行检查(选择是否存在)。

我目前的做法是这样的:

  1. 构建数据库中所有对象的 HashMap 。
  2. 遍历 CSV 并使用 HashMap 来决定是更新还是插入。

这种方法效果很好,测试证明它比对每一行进行这样的单个 IF EXISTS 检查要快得多。

如果数据库中有很多实体,我担心的是内存大小。

现在我正在考虑使用上述方法的细微变化,我想知道意见。基本上我想做的是对多行进行多批 IF EXISTS 检查(例如 SELECT FROM table where sku IN (sku1, sku2, sku3) )

这是一些伪代码:

1. Database contains: db{sku1, sku2,sku3,sku5}

2. file contains: file {sku1, sku2, sku3, sku6}

3. Expected result:
updates: {sku1, sku2, sku3}
inserts{sku6}

4. Algorithm

have a map to keep database entities which need updates
updatemap {}
now iterate over the file in e.g. batches of 2 rows (for demo purposes)
1st iteration: foreach (select where sku IN (sku1, sku2) limit 2) as elem
-> updatemap.add(elem) -> elem is asumed to be a persistent entity here
-> myDAO.update(elem) -> executes Spring's getHibernateTemplate().update() under the hood

-> updatemap contents after 1st loop {sku1, sku2}

2nd iteration: foreach (select where sku IN (sku3, sku6) limit) 2 as elem
-> updatemap.add(elem)
-> myDAO.update(elem)

-> updatemap contents after 3nd loop {sku1, sku2, sku3}

顺便说一句:我也已经假设了像 (if i % 30 == 0) session.flush; 这样的东西。 session.clear();

现在我们知道所有已更新的元素。不在 updatemap 中的所有 skus 基本上都是插入,我们可以使用简单的集合算法来确定这些

file {sku1, sku2, sku3, sku6} - updatemap {sku1, sku2, sku3} = newinserts {sku6}

现在我们可以继续对剩余的 CSV 行进行插入。

结论我的假设是,由于文件内容的分块,我可以限制使用的内存量。我有比我最初的方法更多的 SELECT 语句,但我对内存使用有更多的控制,以防数据库中已经有数千个实体。

您对此有何看法?还有哪些其他有效方法可以找出要更新哪些实体以及批量插入哪些实体?

最佳答案

我遇到了完全相同的问题,涉及数百万条记录,并且几乎完全按照您的方式解决了。旁观者可能不明显的一个约束是我们不能使用常规的 Hibernate 加载-变异-更新方式,因为这会产生过多的冗余流量。

仔细阅读后,我的方法与您的不同之处在于我不保留任何超出处理单个 block 的信息。在继续下一个之前,我完整地处理了 block ,包括所有插入和更新。只有这样,您才能拥有可扩展的解决方案。

对我来说最薄弱的一点是 executeUpdate 的使用,它不会使用 JDBC 批处理 API。我计划进行自定义实现,但对于我的特定用例,事实证明我不需要为每个 block 使用多个 executeUpdate

关于java - Hibernate Mass 插入/更新 : is this a good approach?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12131981/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com