mybatis批量新增和更新优化

mysql 批量更新如果一条条去更新效率是相当的慢, 循环一条一条的更新记录,一条记录update一次,这样性能很差,也很容易造成阻塞。

mysql allowMultiQueries=true允许批量更新

mysql.s.jdbcUrl=jdbc:mysql://********:3306/***?autoReconnect=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true

  

一条insert语句后面拼接的参数个数1000个效率为最佳。
比如一万条数据,如果用一个insert语句后面加一万个参数的速度没有10条insert每条1000个参数快
但是如果一条insert后面的参数低于1000,效率也会慢,因为要提交至少大于一次的事务
就好比抛物线,他有一个峰值,两遍都是降低

 

 

 

最近在优化大批量数据插入的性能问题。
项目原来使用的大批量数据插入方法是Mybatis的foreach拼接SQL的方法。
我发现不管改成Mybatis Batch提交或者原生JDBC Batch的方法都不起作用,实际上在插入的时候仍然是一条条记录的插,速度远不如原来Mybatis的foreach拼接SQL的方法。这对于常理来说是非常不科学的。
后来才发现要批量执行的话,JDBC连接URL字符串中需要新增一个参数:rewriteBatchedStatements=true

master.jdbc.url=jdbc:mysql://xxx:3306/xxx?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&rewriteBatchedStatements=true

MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。
MySQL JDBC驱动在默认情况下会无视executeBatch()语句,把我们期望批量执行的一组sql语句拆散,一条一条地发给MySQL数据库,批量插入实际上是单条插入,直接造成较低的性能。
只有把rewriteBatchedStatements参数置为true, 驱动才会帮你批量执行SQL
另外这个选项对INSERT/UPDATE/DELETE都有效

posted @ 2022-09-14 14:08  张亮java  阅读(3545)  评论(0编辑  收藏  举报