saveBatch很慢,没有批量导入的解决方法(Sringboot+easyExcel+Maybatis_Plus)

文章讲述了作者在使用Excel数据导入时遇到的性能瓶颈,通过观察发现`saveBatch`方法并未按预期批量执行。经过尝试调整SpringBoot配置、添加事务注解和解决数据库连接设置,最终通过`rewriteBatchedStatements`参数解决了问题,导入速度显著提升。
摘要由CSDN通过智能技术生成

目录

问题的发现与定位(哥们我快速定位问题真实太酷啦)

解决方法的过程(要是下面的方法不行,试试这里的)

正确的解决姿势(解决方法在这里,直接点)

成功解决(哥们我真帅啊,又解决一个问题)


着急的直接看正确的解决姿势!!!

问题的发现与定位


今天写了一个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,快了好多。

再看控制台,明显就是批量导入了嘛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值