最近在项目开发中,涉及到批量新增业务,使用到JPA,但是其saveAll性能着实达不到要求,甚至慢的变态(可能是配置没配置好的原因),最后使用了 JdbcTemplate的批处理,性能还是非常不错。
batchHasPlainStatements介绍,参考以下大佬的文章,我这就不赘述了。
https://www.jianshu.com/p/04d3d235cb9f
注:测试 批量新增 1000条数据
JPA saveAll 耗时30秒
JdbcTemplate的批处理(batchHasPlainStatements不设置,默认为false) 耗时30秒
JdbcTemplate的批处理(batchHasPlainStatements=true) 耗时200毫秒
也许差距不是那么大,跟各自的测试数据与机子本身也是有关的。
这里要说的是
关于 batchHasPlainStatements 的配置
spring:
datasource:
username: xxxx
password: xxxx
url: jdbc:mysql://xxxx:3306/xxx?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true
driver-class-name: com.mysql.cj.jdbc.Driver
网上大部分都是 在mysql url后面 跟上 &rewriteBatchedStatements=true,
由于种种原因,我的连接方式可能不是这种url配置方式了,但是必须配置 rewriteBatchedStatements 才能提高批处理性能。
所以可以使用以下方式去配置
spring:
datasource:
hikari:
data-source-properties:
rewriteBatchedStatements: true
通过测试是ok的,因为在 我这个版本的spring boot选用的 连接池是 hikari 所以支持该配置。
如果使用的是 其他的 设置对应的 应该也是ok的,虽然我还没试。
网友评论