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

标签 java spring excel hibernate spring-mvc

我正在为我的 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/

相关文章:

python - 如何使用python从excel文件中删除标题

vba - 编写包含比较运算符 "="的表达式作为子例程参数

java - Catch-all Servlet 防止资源加载

java - 使用斯坦福类型的解析器从文本文件中提取名词短语

excel - 在 Excel 中将整个工作表链接到另一个工作表

java - 如何在 Spring Boot 中管理无限进程?

java - 如何将 ENUM 绑定(bind)到单选按钮?

Linux 中的 Java 命令类路径和 PHP

java - 为什么我收到 DeadlineExceededException : in my web application?

java - 在 Spring Boot 中创建数据库表后运行自定义脚本