-
Notifications
You must be signed in to change notification settings - Fork 4.4k
3.30版本,saveBatch批量插入较慢,批量插入300多条数据,需要19s。 #2786
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
来个复现demo |
从sql打印的日志来看,是单条插入。只是最后一次性事物提交。单条插入那里最耗时 |
遇到同样的问题,看源码中的实现是一个foreach循环,saveBranch中集合有多少条数据就提交多少次,导致效率非常低 |
但是有时候插入3000多条平均1s左右。这跟表的字段大小应该也有关系。我插入300条耗时19s,这张表字段比较多。 |
是有大字段吧? |
设置开启数据库批量提交&rewriteBatchedStatements=true,可以解决批量插入慢的问题 url: jdbc:mysql://127.0.0.1:3306/order?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&failOverReadOnly=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true |
已设置,不然批量的不会生效 |
没有大字段,就单独的字段比较多,有40多个。 |
使用mybatis原生的《foreach》标签写下批量插入脚本,单元测试看看执行时间 |
我也遇到了相同的问题,我使用的是mariadb驱动,mybatis-plus版本为3.3.2,在执行批量操作时会在: protected boolean executeBatch(Collection list, int batchSize, BiConsumer<SqlSession, E> consumer) ;方法内耗时较久,每次插入大概不到100条数据,耗时平均在10S左右。当我使用xml的foreach时插入时间恢复正常。 |
请问你数据连接url有设置开启数据库批量提交&rewriteBatchedStatements=true这个吗? |
字段越多 ognl需要处理的表达式越多,你40个字段排除id就有39个,那就要至少过39*2 次 |
我觉得mp批量操作加个flag参数开关 flag=false关闭就使用单条sql执行 最后事务提交 flag=true开启就使用批量的sql操作(非单条) 这样我们在写的时候 可以自由选择 毕竟量少的走批量就行 mp考虑的是量非常大的情况所以使用单条操作 单条操作是每1000条做一次事物提交(也可以指定条数) |
这块是可以改进的,mybaits-plus使用的刷新SQL Session的方式批量提交,比起数据库批量执行速度相对慢很多。还有批量执行方法,都在方法上添加@transaction注解,量比较大的时候,就会事务超时,事务应该是用户去控制的,而不能为用户去开启事务。 |
我postgresql设置了这个没有效果,他还是一条一条的insert。我用的是 sharding-jdbc-spring-boot-starter 3.1.0.M1 |
有设置此属性的。如果我没有设置此属性的话,xml插入应该也会比较慢吧?我的DB链接如下: |
继承ServiceImpl,再重新把批量插入的方法重写一遍。。。 |
谢谢 |
刚才仔细的看了一下MP中saveBatch方法,他采用的是BatchExecutor来进行所有statement的提交,你有300多条数据,就会执行300多次的sql |
自定义InsertBatch需要以下三步骤:
【BatchMapper】自定义Mapper基类,作用与BaseMapper相似,需要实现InsertBatch的Mapper需继承该接口 public interface BatchMapper {
} 【InsertBatch】自定义批量插入的方法 **
*/
} |
已经使用,谢谢 |
你是怎么解决的大兄弟 |
就是按照你给的方式处理的呀 |
好吧,我以为你有其他的方法 |
可以,其实官方的也不是慢,主要是我的这种表太大,表字段过多。 |
MySQL的JDBC连接的url中要加rewriteBatchedStatements参数,并保证5.1.13以上版本的驱动,才能实现高性能的批量插入。 |
之前在CSDN上看说是只对Insert生效,并且是大于3条的时候生效 |
最新版使用此方式后,一直提示 |
最新版本,加上参数不生效,还是单条去执行 |
当前使用版本(必填,否则不予处理)
3.3.0
该问题是如何引起的?(确定最新版也有问题再提!!!)
重现步骤(如果有就写完整)
报错信息
The text was updated successfully, but these errors were encountered: