Postgresql 如何提高spring数据JPA性能

Postgresql 如何提高spring数据JPA性能,postgresql,performance,spring-boot,jdbc,spring-data-jpa,Postgresql,Performance,Spring Boot,Jdbc,Spring Data Jpa,我试图提高我的应用程序的性能,其中一个操作是从CSV文件读取数据,并将每行的值作为一个POJO(因此1500个CSV行=1500个POJO)存储在PostgresSQL数据库中。它是一个spring引导应用程序,使用JpaRepository(默认配置)作为持久性的手段。我最初的尝试基本上是在循环的每次迭代中读取CSV文件中的每一行时执行以下语句: autowiredRepoInstance.save(objectInstance) 然而,在application.properties文件中的s

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

autowiredRepoInstance.save(objectInstance)

然而,在
application.properties
文件中的
spring.jpa.show sql=true
设置中,我看到每个POJO都有一个插入。我改进性能的尝试是在循环外声明一个ArrayList,在循环内保存该列表中的每个POJO实例,并在每500项执行一次保存,如下所示(现在忽略500的倍数大于/小于500的情况):

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

但任何其他建议也受到欢迎


谢谢。

首先从CSV中读取所有数据,并按如下方式处理

  • 在输入文件上生成缓冲红色流

  • 在缓冲读取器上生成流应用文件管理器或映射以处理数据

  • 作为以上的输出,您将获得实体列表

  • 将实体列表划分为列表实体列表(如果您有超过一百万条记录这样的海量数据)

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

  • 我用上述过程在不到一分钟的时间内处理了130万条记录


  • 或者使用一些批处理技术

    @a_horse_和_no_name我更新了参考。我使用的是9.6。如果您自己编写
    INSERT。。选择
    ,但可接受的解决方案是使用。这与多行插入的概念类似。在您的环境中测试时必须检查的最佳批大小。您应该使用批插入:@Cepr0我查看了您的答案,但出于某种原因,我的repo没有
    saveAll
    方法,即使它也是
    JpaRepository
    @ITWorker
    saveAll()
    方法从Spring Boot 2.0开始。在上一页。版本您可以使用
    save()
    方法。
    loop(
    objList.add(objectInstance);
    
    
        if (objList.size() == 500) {
                    autowiredRepoInstance.save(objList);
                        objList.clear();
          }
      )