【问题标题】:How to improve spring data JPA performance如何提高 Spring Data JPA 性能
【发布时间】:2018-12-10 20:16:16
【问题描述】:

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

autowiredRepoInstance.save(objectInstance);

但是,使用 application.properties 文件中的 spring.jpa.show-sql=true 设置,我看到每个 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

但也欢迎任何其他建议。

谢谢。

【问题讨论】:

  • @a_horse_with_no_name 我更新了参考资料。我正在使用 9.6。
  • 如果您自己编写INSERT .. SELECT,您将获得最佳性能,但可接受的解决方案是使用Hybernate Batch Insert。这类似于 multirow 插入的概念。在您的环境中进行测试时必须检查的最佳批量大小
  • 你应该使用批量插入:stackoverflow.com/a/50882952
  • @Cepr0 我看了你的回答,但由于某种原因,我的仓库没有 saveAll 方法,即使它也是 JpaRepository
  • @ITWorker saveAll() 方法从 Spring Boot 2.0 开始。在上一个。版本可以使用save() 方法。

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


【解决方案1】:

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

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

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

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

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

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

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

或者使用一些批处理技术

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-19
    • 2018-09-19
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2020-02-06
    • 2013-12-13
    相关资源
    最近更新 更多