【原创做品,转载请注明出处】html
写这篇文章以前想着给这篇博客起一个文艺一点的标题,思来想去,想到了那些年咱们爬过的山,或者咱们一块儿趟过的河?代码不规范,同事两行泪,这是多么痛的领悟啊!java
本组一名实习生,因为学校有事情须要回去处理,我便将他的代码接管过来,正好遇上本次迭代上线,须要将同事的代码提交测试,若是被测试出来有bug,我就来负责bug修复,代码优化等。因为不一样的开发人员都有本身的编程习惯,因此不一样人员所写的代码多少都会有些差别,好比:变量的命名、代码的格式等,即便组内有一套开发规范也仍是会出现一些差别,这就是所谓的个性?特色? 固然 特色只是特色,并不能称得上个性。既然风格不一样,那么看别人代码的时候会有值得学习的地方,也有本身感受不舒服的地方。也罢,毕竟人都有“个性”。mysql
此次我接手同事的代码主要是一个Excel导入数据库这样一个功能,在测试人员测试导入数据的时候,使用的导入数据有2w条做为测试数据导入数据库,现象是 导入后发现页面先是显示上传中,以后页面没有任何反馈,经排查后发现是由于后台还在处理导入数据逻辑,时间过长页面没有获得反馈,致使页面超时。sql
对于本次问题的排查,能够总结为问题发现,和问题排查。发现问题时首先要快速了解该功能的主要逻辑是什么,此次的导入主要有两点,一是 导入前判断是否有和数据库重复,二是导入操做。弄明白主要逻辑以后,就要分析,导入慢确定是这两个逻辑的某一个逻辑慢,或者是两个逻辑都慢。通过分析发现,这两个逻辑都出现了循环创建数据库链接的问题,发现了问题的根本缘由后,就要减小创建数据库链接次数,问题便获得解决。数据库
对于导入前和数据库判断是否有重复的,使用了mysql的一个关键字ignore,关键字的做用是:如有致使unique key 冲突的记录,则该条记录不会被插入到数据库中,去重字段必定要是惟一索引。其余就是拼接SQL使用批量导入。下面将主要的代码贴出来供你们参考。编程
// 批量入库,每次批量插入100条 List<Detail> detailList = new ArrayList<>(); List<List<Detail>> tempList = new ArrayList<>(); int insertCount = 100; for (int i = 0; i < detailList.size(); i += insertCount) { if ((i + insertCount) < detailList.size()) { List<Detail> newList = new ArrayList<>(); newList.addAll(detailList.subList(i, i + insertCount)); tempList.add(newList); } else { List<Detail> newList = new ArrayList<>(); newList.addAll(detailList.subList(i, detailList.size())); tempList.add(newList); } } Map<String, Object> map = detailManager.batchInsertDetail(tempList);
<insert id="batchInsertDetail" parameterType="java.util.List"> insert ignore into my_table (id,code,status) values <foreach collection ="list" item="detail" index= "index" separator =","> (#{detail.id,jdbcType=BIGINT},#{detail.code,jdbcType=VARCHAR},#{detail.status,jdbcType=TINYINT}) </foreach > </insert>
原文出处:https://www.cnblogs.com/luao/p/10503345.htmlmybatis