问题
因项目有新功能需求,看完需求后,开始无脑写bug,写完开始调bug,因为功能原因,我在写业务逻辑的时候部分的数据采用了批量保存,没多想,懒的写sql就直接用了MyBatis自带的saveBatch方法,结果调试的时候,好家伙直接给我干懵了,插入3000条数据耗时15秒
排查原因
日常修bug,先看日志,好像也没毛病,于是把sql日志打印出来,我去,居然是一条条insert去执行的,能不耗时吗
解决处理
首先设置执行批量执行sql
在数据库连接配置中设置该属性:rewriteBatchedStatements=true,
不设置好像mysql识别不了还是jdbc识别不了批操作,我比较菜,所以没就这吧,感兴趣可以自行了解
设置完开始验证
方法一、直接使用saveBatch方法
效果
设置支持批量执行后,MyBatis自带的saveBatch方法插入结果,批量插入耗时:579(ps:这里当时没细看,以为好了,但发现耗时还是很高,应该是6、 7秒左右,就换了手写sql的方式,后来才发现saveBatch方法是支持设置执行条数的,默认30条数据执行一次,相当于我插入3000条数据执行了100条insert语句)
方法二、使用saveBatch方法,并设置批量插入条数
这里设置插入3000条,可以明显看到参数条数变多了,3000条组装成一条insert语句
耗时402
方法三、手写插入语句
批量插入耗时157
sql执行日志,一次执行3000条,这里也是一条insert语句,虽说和MyBatis的saveBatch方法一样都是一条sql插入3000条数据,但实际比较下来确实是手写的这种更快写,我也没看为啥,了解的可以直接评论告诉我
总结
方法千千万,合理的、适合自己的的就是最好的,毕竟功能实现了就行,哈哈哈,要求就是这么低。(有不同想法的批评和建议都接受,欢迎吐槽)