【问题标题】:Spring boot 2 upgrade - spring boot data jpa saveAll() very slowSpring Boot 2 升级 - Spring Boot 数据 jpa saveAll() 非常慢
【发布时间】:2023-03-10 16:30:02
【问题描述】:

我将 mysql 与 hibernate 和 spring boot data jpa(spring-boot-starter-data-jpa 和 mysql-connector-java)一起使用。最近我将我的 spring boot 项目从 1.5 升级到了 2.0。 Spring Data CrudRepository 用于保存可迭代的 API 已从 save() 更改为 saveAll()。我对代码进行了更改,它可以工作,但速度很慢:

  • 插入 10 个项目 -> 慢 2 倍(49ms -> 95ms)
  • 插入 100 个项目 -> 慢 6 倍(132 毫秒 -> 840 毫秒)
  • 插入 1000 个项目 -> 慢 10 倍(792 毫秒 -> 8028 毫秒)
  • 插入 10000 个项目 -> 慢 15 倍(4912ms -> 73542ms)
  • 插入 100000 个项目 -> 慢 22 倍(32042ms -> 712702ms)

我已经用一个空表测试了两个弹簧版本的插入。 mysql 服务器版本没有变化:5.7.21 - MySQL Community Server (GPL)

我需要每天插入大约 200 万件物品,所以这种减速非常明显。这是我的配置:

spring.datasource.url = jdbc:mysql://localhost:3306/service?useSSL=false&rewriteBatchedStatements=true
spring.datasource.username = service
spring.datasource.password = service
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.hikari.maximum-pool-size=5

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.jdbc.batch_size=50
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true

有人知道更新带来了什么变化以及如何再次加快速度吗?

【问题讨论】:

  • AFAIK 该方法会将每个实体一个一个地插入到数据库中,因此您必须使用批量插入来完成。 vladmihalcea.com/…
  • 我测试了批量插入的方法,但是没有效果。手动实现与 saveAll 方法一样慢。有趣的是,使用 spring boot 1.5 的手动批量插入方法与 CrudRepository 中的旧保存方法一样快。也许随着 2.0 版的更新,会有一些基本的架构变化。
  • 你有没有设法解决这个问题,或者至少弄清楚问题是什么?

标签: java mysql hibernate spring-boot


【解决方案1】:

在 application.properties 中设置 spring.jpa.properties.hibernate.generate_statistics = true

hibernate:
  generate_statistics: true

https://www.baeldung.com/spring-data-jpa-batch-inserts

【讨论】:

    猜你喜欢
    • 2020-04-11
    • 2019-01-14
    • 2021-01-18
    • 2021-08-13
    • 2020-09-15
    • 2018-11-22
    • 2019-03-01
    • 2021-04-15
    • 1970-01-01
    相关资源
    最近更新 更多