我正在为我的 Web 应用程序使用 Spring MVC、Hibernate。我正在使用 Apache POI 从 excel 加载数据。我能够成功加载数据,但我认为我的方法在性能和内存方面效率不高. 我正在解释我目前正在做的事情以及我认为可以提高性能的事情。
- 我正在使用 POI 阅读工作表,然后阅读遍历每一行,然后遍历列。
在此单行迭代期间,我创建了一个 DTO 并将其传输到提供事务和调用 DAO 层(基本上调用 save() 方法)的服务。如果数据已经存在或无效,然后抛出异常,我知道哪个 Excel 行的数据有问题。 它也有点像数据验证。
然后我迭代另一行并再次执行步骤 2。
这就是为什么我认为我的方法是错误的,对此我希望您提出正确或错误的建议。
我不是一次从 excel 中读取所有数据,而是在每一行上调用服务和 DAO,这会浪费时间在方法之间切换。
由于数据是要保存在数据库中,不做任何修改,所以应该直接加载到数据库中,而不是先创建一个对象,然后保存持久化。我不是在做批量和批处理操作。
这是我认为我应该做的:
- 首先从 excel 中获取所有数据并将其存储在某个集合中。
- 然后我将迭代集合,在迭代期间,我将使用该对象向 HQL 提供数据并执行查询。
- 这是在一个事务中执行多个插入查询的正确方法吗?
提交事务时,是否所有查询都执行或与数据库同步?如果是,那么持久化上下文不会很大吗?
<这是否确认 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/