来自excel的Hibernate批量加载:针对更好性能的设计或方法的建议

时间:2013-09-21 21:20:18

标签: java spring excel hibernate spring-mvc

我正在使用Spring MVC,Hibernate用于我的Web应用程序。我使用Apache POI从excel加载数据。我成功地能够加载数据,但我认为我的方法在性能和内存方面效率不高。 我正在解释我正在做什么,以及我认为会改善表现。

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

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

  4. 这就是为什么我认为我的方法是错误的,我希望你建议如果对或错。

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

    2. 由于数据要保存在数据库中而不进行修改,因此应将其直接加载到数据库中,而不是先创建一个对象,然后保存持久化。我不进行批量和批量操作。

    3. 以下是我认为我应该做的事情:

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

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

      6. 你说什么人?你的建议请。

1 个答案:

答案 0 :(得分:1)

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

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

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

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