1、问题

上传带有手机号的excel文件,解析后,将手机号数据存储到oss,并返回oss地址以及手机号条数,

excel文件放开大小限制后,上传文件处理时间过过长。

  • 文件大小:1.2M,行数:30265。
  • http响应504,nginx日志499。

img

img

img

2、定位

2.1、本地跑工程,测试文件上传

现有代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-base</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-web</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-annotation</artifactId>
<version>3.0.3</version>
</dependency>

其中apache poi的版本为:3.15。

1
2
3
4
cn.afterturn.easypoi.excel.ExcelImportUtil
.importExcel(Paths.get("群发客户.xls").toFile(),
XXXVo.class,
new cn.afterturn.easypoi.excel.entity.ImportParams());

测试耗时:217834ms

2.2、参考marketing-dump与member-dump数据导入工程代码

2.2.1、marketing-dump使用了easyexcel

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.6</version>
</dependency>

其中apache poi的版本为:3.17。

1
EasyExcel.read(inputStream, XXX.class, xxxImportListener).sheet().doRead();

测试耗时:3523ms

2.2.2、member-dump使用了jeecg的easypoi

1
2
3
4
5
<dependency>
<groupId>org.jeecg</groupId>
<artifactId>easypoi-base</artifactId>
<version>2.4.0</version>
</dependency>

其中apache poi的版本为:3.15。

1
2
3
4
org.jeecgframework.poi.excel.ExcelImportUtil
.importExcel(Paths.get("群发客户.xls").toFile(),
CustomerVo.class,
new org.jeecgframework.poi.excel.entity.ImportParams());

测试耗时:3267ms

2.3、升级afterturn easypoi 版本到4.4.0

  • apache poi的版本为:4.1.1。

测试耗时:873ms

3、思考

3.1、为什么2.4.0版本的jeecgframework的easypoi比3.0.3版本的afterturn的处理速度快?

对比了一下内部的方法,主要区别在于,afterturn多了一段代码,内部循环处理比较耗时。

img

img

3.2、jeecgframework与afterturn有什么关系,为什么方法参数那么相似?

jeecg官网

上海悟耘信息科技有限公司 EasyPoi官网 AiCode官网 风铃官网 windbell官网

3.3、为什么升级4.4.0版本后的afterturn easypoi 速度那么快?

增加了参数needMore,当值为false时,速度会快,当将值改为true,速度就会从873ms下降到12818ms。

img

4、解决

  • 现有cn.afterturn的easypoi在系统中存在依赖,所以版本不可随意升级,所以只能通过引入新的jar来解决问题。
  • easyexcel使用的apache poi版本与afterturn easypoi有些冲突,没选这个方案。
  • 必须保证底层apache poi版本与afterturn easypoi保持一致,所以引入jeecg easypoi 2.4.0版本临时解决问题。

5、注意

当macan工程的导出功能全部迁移到task工程,可将afterturn easypoi版本升高,并去掉jeecg easypoi依赖。