如何改善Spring Data JPA性能

时间:2018-07-02 14:56:08

标签: postgresql performance spring-boot jdbc spring-data-jpa

我正在尝试提高应用程序的性能,其中一项操作是从CSV文件读取数据并将每一行的值存储为一个POJO(因此1500 CSV行= 1500 POJO)在PostgresSQL数据库中。它是一个Spring Boot应用程序,使用JpaRepository(具有默认配置)作为持久性手段。我最初的尝试基本上是在循环的每次迭代中使用以下语句,因为它读取了CSV文件中的每一行:

autowiredRepoInstance.save(objectInstance);

但是,在spring.jpa.show-sql=true文件中的application.properties设置下,我看到每个POJO都进行了一次插入。我提高性能的尝试是在循环外声明一个ArrayList,将POJO的每个实例保存在循环内的该列表中,然后在第500个项目中执行以下保存操作(现在忽略存在更多情况的情况) /小于500的倍数):

loop(
objList.add(objectInstance);


    if (objList.size() == 500) {
                autowiredRepoInstance.save(objList);
                    objList.clear();
      }
  )

但是,这也会生成单个插入语句。我可以更改哪些设置来提高性能?具体来说,我想减少SQL语句/操作的数量,并让底层的Hibernate使用postgresql允许的“ multirow”插入:

https://www.postgresql.org/docs/9.6/static/sql-insert.html

但是也欢迎其他任何建议。

谢谢。

1 个答案:

答案 0 :(得分:0)

首先从CSV中读取所有数据,然后进行如下处理

  1. 在输入文件上生成缓冲流

  2. 通过缓冲读取器生成流,应用文件管理器或映射以处理数据

  3. 作为上述输出,您将获得实体列表

  4. 将实体列表划分为列表实体列表(如果您拥有大量数据(例如,超过一百万条记录)

  5. 批量传递内部实体列表(可以设置10000个)JPA存储库保存方法(如果可能,请使用并行流)

  6. 通过上述过程,我在不到一分钟的时间内处理了130万条记录

或使用一些批处理技术