目录
问题的发现与定位(哥们我快速定位问题真实太酷啦)
解决方法的过程(要是下面的方法不行,试试这里的)
正确的解决姿势(解决方法在这里,直接点)
成功解决(哥们我真帅啊,又解决一个问题)
着急的直接看正确的解决姿势!!!
问题的发现与定位
今天写了一个excel的导入,测试了100条数据,显示要3s,我人都傻了,这么慢,关键是我用的还是saveBatch的批量导入。
这里是我在监听器里面重写的方法,我想着全部数据解析完然后批量导入的。当然,我看市面上主流方法都是判断解析了100条数据等就批量导入一次,因为我不知道怎么处理最后不足100条的数据就直接写在doAfterAllAnalysed这里了,嘿嘿嘿。
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
// 所有数据解析完成后的操作,可以在这里进行一些清理工作
index=1;
String message=validateError.toString();
if (!examineeList.isEmpty()&&validateError.length()==0) {
validateError=new StringBuilder();
// 将转换后的数据插入到数据库
examineeService.saveBatch(examineeList);
// 清空列表,为下一批数据做准备
examineeList.clear();
}
else{
validateError=new StringBuilder();
throw new MyRuntimeException(500,message);
}
}
很明显能看到我是用saveBatch的,然后我就以为这是每条数据分析完都会调用这个方法,第一次用不熟悉这些方法,所以在这个方法里面增加了控制台的输出方便我看被调用了几次。
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
System.out.println("所有数据解析完成后的操作");
结果很明显啊,确实只调用了一次。所以说问题就出在了saveBatch方法上面,我打开Mybatis log 发现这明显就是单条数据在单词插入。
然后我就开始库茨库茨的搜索看看是什么原因
解决方法的过程
我先是问了万能的GPT,它跟我说要在springboot的application.yml/application.properties中启动批处理。我大学生主打一个听劝,库茨库茨加上了。
application.properties:
<configuration>
<!-- 其他配置项 -->
<settings>
<setting name="defaultExecutorType" value="BATCH"/>
</settings>
</configuration>
application.yml
mybatis:
configuration:
default-executor-type: BATCH
ok啊重新运行一波,还是没用,😅(#尴尬)
我又接着搜,说是我没有定义事务,我直接加上@Transactional
还是没用。
正确的解决姿势
最后我找来找去,发现一篇文章说是我数据库连接的问题。
只要在数据库连接的url里面加上下面这行代码就可以了
rewriteBatchedStatements=true
如果说你还是不太清楚在哪里加,就是在application.yml/application.properties里面啊
有这一个代码的地方
jdbc:mysql://数据库地址/数据库名?useUnicode=true&characterEncoding=UTF8&allowMultiQueries=true&rewriteBatchedStatements=true
成功解决
然后就完事了,我重新运行,嘎嘎快啊。
爽死了,885ms,快了好多。
再看控制台,明显就是批量导入了嘛。