问题:
项目使用的是Mybatis持久层框架,之前的旧导入业务十分耗时,影响体验。
定位:
经过排查发现,处理一条数据需要执行3条DDL语句,导入2k数据则需要执行6K DDl语句,这些DDL语句写在forEach中,且逐条执行,也就是说要频繁创建Mysql数据库连接,这是影响执行效率的主要原因。
优化思路:
将需要处理的数据对象放入集合中,使用批插入和批更新方法,减少连接创建次数,同时,批处理的数据也需要控制,数据量不能太大,也不能太小,需控制在一个完美的量度。
执行方案:
insert DDL 语句我们直接使用 insert into table values (),()...
update DDL 语句的批处理需要使用;拼接SQL语句,此时调用执行会提示语法错误,我们需要在database的url链接上添加一个参数allowMultiQueries=true
经过测试发现集合长度控制在50左右(受不同因素影响,值不唯一),此时批处理的执行速率最高,执行效率提高了5倍。
// insert
if(insertList.size() > 50){
service.saveBath(insertList);
insertList.clear();
}
// update
if(updateList.size()>50){
service.updateBath(updateList);
updateList.clear();
}
...
// 兜底补偿
if(insertList.size() > 0){
service.saveBath(insertList);
}
if(insertList.size() > 0){
service.updateBath(updateList);
}
高端的厨艺,往往只需要最简单的烹饪方式。