【发布时间】: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