我正在使用Spring MVC,Hibernate用于我的Web应用程序。我使用Apache POI从excel加载数据。我成功地能够加载数据,但我认为我的方法在性能和内存方面效率不高。 我正在解释我正在做什么,以及我认为会改善表现。
在这个单行迭代过程中,我创建了一个DTO并将其传输到提供transcation的服务并调用DAO层(基本上调用了save()方法)。如果数据已经存在或者它无效,然后抛出异常,我知道哪个Excel行在数据中有问题。 它有点像数据验证。
然后我迭代另一行并再次执行第2步。
这就是为什么我认为我的方法是错误的,我希望你建议如果对或错。
我没有从excel中读取所有数据,而是在每行调用service和DAO,这会浪费时间在方法之间切换。
由于数据要保存在数据库中而不进行修改,因此应将其直接加载到数据库中,而不是先创建一个对象,然后保存持久化。我不进行批量和批量操作。
以下是我认为我应该做的事情:
当我提交事务时,是否所有查询都已执行或与数据库同步?如果是,那么Persistence上下文的大小不会很大吗?
这是否确认了hibernate中的批量操作?
你说什么人?你的建议请。
答案 0 :(得分:1)
您当前的实施是正确的方法。需要进行的一项更改是在单个事务中组合一堆行,而不是在单独的事务中更新/插入每一行。这样,hibernate将使用jdbc批量更新/插入来减少数据库往返次数。
如果总行数可能很大,那么您应该将其分解为多个事务或使用定期刷新& clear - 以便持久化上下文中的对象被推送到数据库,并且这些对象有资格进行垃圾回收。
将所有数据加载到内存中并且处理不是一个好主意。如果数据集大小很大,您将遇到内存不足问题。
这部分来自hibernate参考,有更多细节和其他选项。 https://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html