首页 > 解决方案 > 如何提高 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 允许的“多行”插入:

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

但也欢迎任何其他建议。

谢谢你。

标签: postgresqlperformancespring-bootjdbcspring-data-jpa

解决方案


首先从 CSV 读取所有数据并进行如下处理

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

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

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

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

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

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

或者使用一些批处理技术


推荐阅读