Hibernate从Excel中批量加载:devise或方法的build议,以获得更好的性能

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

  1. 使用兴趣点我正在阅读表格,然后读取迭代每一行,然后遍历列。
  2. 在这个单行迭代过程中,我创build了一个DTO,并将它传递给提供transcation的服务,并调用DAO层(基本上调用save()方法)。如果数据已经存在或者其无效,则引发exception知道哪个Excel行在数据中有问题。 它也像数据validation一样。

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

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

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

  2. 由于数据将被保存在数据库中而不进行修改,因此应该直接将其加载到数据库中,而不是先创build对象,然后再保存它。我不做批量和批处理操作。

这是我认为我应该做的事情:

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

  5. 这确认批量操作在hibernate?

你说什么家伙?你的build议请。

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

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

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

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

Interesting Posts