3

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

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

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

这就是为什么我认为我的方法是错误的,我希望你提出建议,如果是对还是错。

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

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

这是我认为我应该做的:

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

  5. 这是否确认休眠中的批量操作?

你说什么伙计们?你的建议请。

4

1 回答 1

1

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

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

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

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

于 2013-09-22T07:13:16.047 回答