Postgresql 如何提高spring数据JPA性能
我试图提高我的应用程序的性能,其中一个操作是从CSV文件读取数据,并将每行的值作为一个POJO(因此1500个CSV行=1500个POJO)存储在PostgresSQL数据库中。它是一个spring引导应用程序,使用JpaRepository(默认配置)作为持久性的手段。我最初的尝试基本上是在循环的每次迭代中读取CSV文件中的每一行时执行以下语句: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
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
@ITWorkersaveAll()
方法从Spring Boot 2.0开始。在上一页。版本您可以使用save()
方法。
loop(
objList.add(objectInstance);
if (objList.size() == 500) {
autowiredRepoInstance.save(objList);
objList.clear();
}
)