gpt4 book ai didi

java - 从 excel : suggestions for design or approach for better performance 批量加载 Hibernate

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:07:47 25 4
gpt4 key购买 nike

我正在为我的 Web 应用程序使用 Spring MVC、Hibernate。我正在使用 Apache POI 从 excel 加载数据。我能够成功加载数据,但我认为我的方法在性能和内存方面效率不高.我正在解释我目前正在做的事情以及我认为可以提高性能的事情。

  1. 我正在使用 POI 阅读工作表,然后阅读遍历每一行,然后遍历列。
  2. 在此单行迭代期间,我创建了一个 DTO 并将其传输到提供事务和调用 DAO 层(基本上调用 save() 方法)的服务。如果数据已经存在或无效,然后抛出异常,我知道哪个 Excel 行的数据有问题。它也有点像数据验证。

  3. 然后我迭代另一行并再次执行步骤 2。

这就是为什么我认为我的方法是错误的,对此我希望您提出正确或错误的建议。

  1. 我不是一次从 excel 中读取所有数据,而是在每一行上调用服务和 DAO,这会浪费时间在方法之间切换。

  2. 由于数据是要保存在数据库中,不做任何修改,所以应该直接加载到数据库中,而不是先创建一个对象,然后保存持久化。我不是在做批量和批处理操作。

这是我认为我应该做的:

  1. 首先从 excel 中获取所有数据并将其存储在某个集合中。
  2. 然后我将迭代集合,在迭代期间,我将使用该对象向 HQL 提供数据并执行查询。
  3. 这是在一个事务中执行多个插入查询的正确方法吗?
  4. 提交事务时,是否所有查询都执行或与数据库同步?如果是,那么持久化上下文不会很大吗?

    <
  5. 这是否确认 hibernate 中的批量操作?

大家怎么看?请提出您的建议。

最佳答案

您当前的实现是正确的做法。需要做的一个改变是在一个事务中合并一堆行,而不是在一个单独的事务中更新/插入每一行。这样,hibernate 将使用 jdbc 批量更新/插入来减少数据库往返次数。

如果总行数可能很大,那么您应该将其分解为多个事务或使用周期性刷新和清除 - 以便将持久性上下文中的对象推送到数据库,并且这些对象有资格成为垃圾 Collection 。

将所有数据加载到内存中并进行处理不是一个好主意。如果数据集很大,您将遇到内存不足的问题。

hibernate 引用的这一部分有更多细节和其他选项。 https://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html

关于java - 从 excel : suggestions for design or approach for better performance 批量加载 Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18937751/

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