Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从excel进行Hibernate批量加载:设计建议或提高性能的方法_Java_Spring_Excel_Hibernate_Spring Mvc - Fatal编程技术网

Java 从excel进行Hibernate批量加载:设计建议或提高性能的方法

Java 从excel进行Hibernate批量加载:设计建议或提高性能的方法,java,spring,excel,hibernate,spring-mvc,Java,Spring,Excel,Hibernate,Spring Mvc,我的Web应用程序使用Spring MVC和Hibernate。我使用Apache POI从excel加载数据。我成功地加载了数据,但我认为我的方法在性能和内存方面效率不高。 我正在解释我现在正在做什么,以及我认为什么会提高绩效 我使用POI读取工作表,然后读取迭代每行,然后迭代列 在这一单行迭代过程中,我创建了一个DTO,并将其传输到提供转换和调用DAO层(基本上调用save()方法)的服务。如果数据已经存在或无效,则抛出异常,我知道哪个Excel行在数据中有问题。 这有点像数据验证 然后我迭

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

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

  • 然后我迭代另一行并再次执行步骤2

  • 这就是为什么我认为我的方法是错误的,我想让你提出我的方法是对还是错。

  • 我不是一次从excel读取所有数据,而是在每一行调用service和DAO,这会浪费时间在方法之间切换

  • 由于数据要保存在数据库中而无需修改,因此应该直接加载到数据库中,而不是先创建对象,然后保存并持久保存。我不做批量和批处理操作

  • 以下是我认为我应该做的:

  • 首先从excel中获取所有数据并将其存储在某个集合中
  • 然后我将迭代集合,在迭代过程中,我将使用该对象向HQL提供数据并执行查询
  • 这是在一个事务中执行多个insert查询的正确方法吗
  • 提交事务时,是否执行了所有查询或与数据库同步?如果是,则持久性上下文的大小不是很大吗?

  • 这是否确认hibernate中的批量操作


  • 伙计们,你们怎么说?请给出你们的建议。

    你们当前的实施方式是正确的。需要进行的一个更改是在单个事务中合并一组行,而不是在单独的事务中更新/插入每一行。通过这种方式,hibernate将使用jdbc批更新/插入来减少数据库往返次数

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

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

    hibernate参考中的这一部分提供了更多详细信息和其他选项。