springboot篇章整体栏目: 


【一】springboot整合swagger(超详细

【二】springboot整合swagger(自定义)(超详细)

【三】springboot整合token(超详细)

【四】springboot整合mybatis-plus(超详细)(上)

【五】springboot整合mybatis-plus(超详细)(下)

【六】springboot整合自定义全局异常处理

【七】springboot整合redis(超详细)

【八】springboot整合AOP实现日志操作(超详细)

【九】springboot整合定时任务(超详细)

【十】springboot整合redis实现启动服务即将热点数据保存在全局以及redis(超详细)

【十一】springboot整合quartz实现定时任务优化(超详细)

【十二】springboot整合线程池解决高并发(超详细,保你理解)

【十三】springboot整合异步调用并获取返回值(超详细)

【十四】springboot整合WebService(超详细)

【十五】springboot整合WebService(关于传参数)(超详细)

【十六】springboot整合WebSocket(超详细)

【十七】springboot整合WebSocket实现聊天室(超详细)

【十八】springboot实现自定义全局异常处理

【十九】springboot整合ElasticSearch实战(万字篇)

【二十】springboot整合过滤器实战

【二十一】springboot整合拦截器实战并对比过滤器

【二十二】springboot整合activiti7(1) 实战演示篇

【二十三】springboot整合spring事务详解以及实战

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

【二十五】springboot整合jedis和redisson布隆过滤器处理缓存穿透


在公司开发时,遇到一个很常见的导入功能的需求,需要导入Excel文件,由此想到了阿里巴巴的EasyExcel这个方便的工具,当客户给我说需要支持大数据量导入时,我想到了使用线程池来多线程处理导入数据库这个操作。由此本章记录一下这次操作。

qq交流群导航——>231378628

首先,整体的大概流程差不多是这个样子:

效果:


真实项目上是公司封装的RPC框架,这次demo直接使用的前面的整合mybatis-plus的demo来写的。

首先看下目录结构

图片中框选部分就是本章需要修改到的或者新创建的文件,后面一一解读,下面的描述可以对标这个图片中的类名。

然后介绍下本章需要做的准备工作:

  • 数据库表
  • 修改application配置文件,修改tomcat的最大文件上传限制(否则excel文件太大,上传会报错)
  • 开启mybatis-plus的批量插入功能,mybatis-plus默认只有insert这个单条插入功能(若自己的项目不使用这个,则不需要,这只是我的demo上没有批量插入方法)
  • 创建excel多线程导入接口所需的各个类

目录

一、准备数据库和Excel文件

二、引入所需依赖

三、修改配置文件,修改文件大小默认限制

四、开启mybatis-plus的批量保存功能

五、创建所需工具类

六、创建业务各层代码

七、创建easyExcel事件监听器

八、创建自定义线程类

九、测试单线程和多线程处理的效率


一、准备数据库和Excel文件

CREATE TABLE `deadman` (`uid` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '主键',`idCard` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '身份证号',`userName` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '死者姓名',`sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '死者性别',`age` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '死者年龄',`reason` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '死因',`house` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '安排地狱层数',PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;


二、引入所需依赖

主要是导入easyExcel所涉及的依赖,如下:


三、修改配置文件,修改文件大小默认限制

这个必须修改,不然后面接口都进不去,默认tomcat服务器是限制了上传文件的大小的。

spring:servlet:multipart:max-file-size: 100MBmax-request-size: 100MB
server:tomcat:max-swallow-size: 100MB 

四、开启mybatis-plus的批量保存功能

这次demo整合的rpc框架是Mybatis-plus,所以找了一个方法去实现批量保存,如下:

1、新建一个SpiceSqlInjector类

PS:注意框选部分类名。

2、创建SpiceBaseMapper接口类

PS:本来是业务的接口层去继承BaseMapper,此处又它去继承BaseMapper,然后加如上图这个方法,注意名称必须是这个否则后面调用该方法会报错。

3、创建业务所需的Mapper层

继承刚才自定义的接口类。

由此就可以通过注入DeadManMapper调用上面的方法实现批量插入了。

如下:


五、创建所需工具类

在通过EasyExcel导入时,会涉及到一些数据类型不满足入参之类的,本次demo涉及到如下工具类。

1、MultipartFileToFileUtils

将传入的MultipartFile类型转为File类型,Controller接收到的是MultipartFile类型,EasyExcel.read方法所需要的是File类型。

2、SpringJobBeanFactory

在监听器类注入mappe时会报空指针,使用如下工具类继承ApplicationContextAware,获取bean对象。


六、创建业务各层代码

1、controller层

2、映射数据库的实体类

关于mybatis-plus相关的注解可以去看看前面的文章。

3、easyExcel的实体类

index指的是excel表上面的行编号,例如

4、service层

5、service的实现类层

上面的方法是多线程处理的事件监听器,下面的是单线程的事件监听器,后面针对两种方式都做一下对比。


七、创建easyExcel事件监听器

1、单线程的事件监听器

解析:该监听器继承自AnalysisEventListener类,泛型指定为上面easyExcel指定的实体类对象类。重写该类的两个方法:invoke和doAfterAllAnalysed。

invoke():该方法会从excel表的第二行开始读取数据。

doAfterAllAnalysed():当invoke将excel的数据全部解析完后,会执行该方法,所以在该类进行数据的入库即可。

此时,单线程的导入已经完成,我们最后再对比测试两种监听器的效率,现在创建多线程事件监听器。

2、多线程的事件监听器

解析:同样是重写上面说的那两个方法。invoke方法的处理不变,修改doAfterAllAnalysed方法的处理,在该方法通过创建线程池的方法,将创建的线程任务提交到线程池,让线程池进行多线程任务的执行,从而实现多线程执行导入操作。

流程:创建线程池——》计算每个线程需要处理的数据——》创建CountDownLatch对象(保证最后每个线程会回到主线程)——》循环线程数量并提交线程任务到线程池——》执行CountDownLatch对象的await方法,让当前线程处于等待状态,等待CountDownLatch减少为1后会唤醒当前线程——》每个线程处理自己的数据并在处理完后执行CountDownLatch对象的countDown方法,让CountDownLatch对象的值减一——》当CountDownLatch的值为0时(说明线程池类的线程任务以及执行完成),执行主线程的代码——》关闭线程池


八、创建自定义线程类

此步骤创建上面描述的线程任务类。

实现Callable或者Runable或者继承Thread都行,此处实现Runable,重写run方法。

根据传入的划分给他的数据区间,将该区间的数据通过subList方法取出来之后,执行上面实现的批量插入方法进行数据的入库操作。为了防止代码出现问题不执行coutDown方法,将该句代码写入finally。

PS:CountDownLatch的两个方法(countDown,await)配合使用,保证每个线程的代码执行时,主线程进入等待,然后等各个线程任务执行完后,又回到主线程进行执行。


九、测试单线程和多线程处理的效率

上面已经完成了单线程和多线程事件监听器的编写,下面开始测试两者的效率。

1、使用单线程事件监听器

结果:100033条数据,数据正确。

2、使用多线程事件监听器

结果:100033条数据,数据正确,确实快了很多。


我觉得对于业务简单的多线程处理类似场景的都可以拿这个demo拿去改造一下,如果有问题,谢谢大家指出。瑞思拜。

qq交流群导航——>231378628

【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据相关推荐

  1. 异常处理程序和软件异常——Windows核心编程学习手札之二十四

    异常处理程序和软件异常 --Windows核心编程学习手札之二十四 CPU负责捕捉无效内存访问和用0除一个数值这种错误,并相应引发一个异常作为对错误的反应,CPU引发的异常称为硬件异常(hardwar ...

  2. 【Visual C++】游戏开发五十七 浅墨DirectX教程二十四 打造游戏GUI界面(二)

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/16922703 作者:毛星 ...

  3. 多线程教程(二十四)CAS+volatile

    多线程教程(二十四)CAS+volatile 获取共享变量时,为了保证该变量的可见性,需要使用 volatile 修饰. 它可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量 ...

  4. 大话设计模式笔记(二十一、二十二、二十三、二十四、二十五、二十六)

    二十一.单例模式(Singleton) 定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 1.通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象.一个最好的办法就是 ...

  5. J2EE进阶(二十四)JBoss Web和 Tomcat的区别

    J2EE进阶(二十四)JBoss Web和 Tomcat的区别 在Web2.0的浪潮中,各种页面技术和框架不断涌现,为服务器端的基础架构提出了更高的稳定性和可扩展性的要求.近年来,作为开源中间件的全球 ...

  6. 二十四、Struts2中的UI标签

    二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...

  7. python 分数序列求和公式_Python分数序列求和,编程练习题实例二十四

    本文是关于Python分数序列求和的应用练习,适合菜鸟练习使用,python大牛绕行哦. Python练习题问题如下: 问题简述:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13 要 ...

  8. 数字图像处理领域的二十四个典型算法及vc实现、第一章

    数字图像处理领域的二十四个典型算法及vc实现.第一章 作者:July   二零一一年二月二十六日. 参考:百度百科.维基百科.vc数字图像处理. --------------------------- ...

  9. 山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将...

    山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将 "我是第一次--请你,请你温柔一点--"少女一边娇喘着,一边将稚嫩的红唇紧贴在男子耳边,樱桃小嘴盈溢 ...

最新文章

  1. 好程序员分享做HTML5页面你要懂得这些
  2. 无缝融合 ZStack与阿里云联手布局混合云市场
  3. java定义全局变量_矮油,你知道什么是 Java变量的作用域 嘛?
  4. 正则表达式grep, egrep, fgrep
  5. java中的最终变量_在lambda表达式中使用的变量应该是最终变量或有效的最终变量。...
  6. 完成AOP 顶层设计-AopConfig
  7. 类的转换函数调用的优先级与是否用const修饰的关系
  8. 回顾 - 判断质数精简算法
  9. Mybatis if标签和where标签结合巧妙使用
  10. jsp页面获取系统的日期时间
  11. 【Kafka】Elasticsearch 与 Kafka 整合剖析
  12. 堪称神器的办公工具,国产精品福昕PDF编辑器上榜
  13. python朋友圈点赞统计_微信公众号所有历史文章的标题/点赞数/阅读数统计
  14. MAVEN工具篇——maven打包跳过测试
  15. input输入密码的时候调用纯数字键盘和加密,js弹出键盘
  16. html简单的折叠菜单
  17. 【蓝桥杯单片机的备赛旅行日记系列】之国赛决赛第五届多功能事件记录器
  18. 【官方文档】Fluent Bit 数据管道之输入插件(Tail)
  19. CSS 之 Flex布局
  20. DDL(数据库定义语言)

热门文章

  1. Shell函数(函数定义、函数变量、函数调用、函数传参、函数返回值、获取函数返回值)
  2. 编译指令 #pragma optimize
  3. 中富金石诊股 稀土开采配额下发 来看看都有谁
  4. 四平战役(1946年)作战地图
  5. ARP和RARP协议
  6. 【Maya】新建相机
  7. Layui数据表格调整行高
  8. 干电池升压IC,电流大,功耗低
  9. Xceed Ultimate Suite 22.3 Crack
  10. 首席新媒体运营黎想教程:短视频运营选题方案指南