我最近项目中遇到一个jdbctemplate的batchupdate方法批量插入的问题,5万条数据分批插入,每次批量插入1000条,结果半个小时数据还没插完。跟踪了一下batchupdate源码:
发现有判断这个rewriteBatchedStatements参数,于是在数据库连接url中加上
rewriteBatchedStatements=true
经过断点调试,发现执行了第二个批量插入,但是速度还是出奇的慢,于是我开始怀疑是不是插入的sql语句有什么问题。
看了一下查询sql:
INSERT INTO table_name (OBJID,XZSJ,XGSJ,PCH,H56000,H57000,H58000,H59000,H5A000)
VALUES ((select ifnull(max(objid),0)+1 from table_name),now(),now(),'1300000000_3_20230531_02_Q',:H56000,:H57000,:H58000,:H59000,:H5A000)
发现了猫腻,由于特殊原因,表没有使用自增主键,这里的插入语句values里面又用了select max()去查询最大主键,导致每次插入都会执行查询,于是我把这里的select max去掉,发现批量插入的速度就很快了,5万数据插入只花了几秒钟