Spring Boot 2 升级 - Spring Boot Data JPA 的 saveAll() 方法非常缓慢

7
我使用hibernate和spring boot data jpa(spring-boot-starter-data-jpa和mysql-connector-java)与mysql一起工作。最近,我将我的Spring Boot项目从1.5升级到2.0版本。Spring数据CrudRepository的API已更改,现在要使用saveAll()方法代替save()方法来保存可迭代数据。我在代码中进行了更改并运行,但速度非常慢:
- 插入10个项目->慢2倍(49ms->95ms) - 插入100个项目->慢6倍(132ms->840ms) - 插入1000个项目->慢10倍(792ms->8028ms) - 插入10000个项目->慢15倍(4912ms->73542ms) - 插入100000个项目->慢22倍(32042ms->712702ms)
我已经测试了两个Spring版本在空表上插入数据的情况。MySQL服务器版本没有更改:5.7.21 - MySQL Community Server(GPL)
我每天需要插入约2百万个项目,因此这种减速是非常严重的。这是我的配置:
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

有人知道更新后发生了什么变化以及如何再次加速吗?

1
据我所知,该方法将逐个将每个实体插入数据库中,因此您必须使用批量插入来完成。https://vladmihalcea.com/the-best-way-to-do-batch-processing-with-jpa-and-hibernate/ - Wilder Valera
我测试了批量插入方法,但是没有任何效果。手动实现的速度和saveAll方法一样慢。有趣的是,使用Spring Boot 1.5的手动批量插入方法与CrudRepository的旧保存方法一样快。也许版本更新至2.0存在一些基本架构更改。 - DaTa
你解决了这个问题,或者至少弄清楚了问题是什么了吗? - Michele Palmia
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接