1. 问题现象

最近线上项目有反馈说,导出数据(excel文件格式)时,经过一段时间(60秒左右)的等待后,出现了闪退现象,直接跳转到了登录页面。

2. 原因分析

经过综合分析,主要存在以下几个方面的原因:

  1. 阿里云负载均衡的超时时间设置太小(60秒),正常页面没有问题,时间长的任务就容易超时,超时后页面跳转登录页面;
  2. 数据库查询时间长,以及写入Excel时间长导致超时;
  3. 每条数据查询一次机构名称,导致数据库访问次数多,时间长;
  4. java进程的设置的最大内存设置为1GB;
  5. 负载均衡的超时时间为60秒,太短无法满足需求;

总的来说,就是随着数据量的不断增加,查询数据需要的时间变长(sql也需要做进一步的优化来提高查询效率),单次导出的数据量没有添加限制,可能一次导出30万到50万的数据,这使得数据库查询时间增加,excel文件生成的时间也增加。

3. 解决办法

解决方法从简单到复杂,提供3个方面的办法。

  1. 最直接的办法:修改负载的超时时间,将超时时间修改为180秒;该方法可以大幅减少闪退的问题,但仍然无法解决慢的问题;
  2. 数据库再优化,针对特定的查询条件组合提供联合索引;建立常用查询关键字段组合的联合索引,提高查询速度;
  3. 采用异步方式(如定时任务)生产导出Excel文件,生成后用户再进行下载;针对需要导出的数据量的大小做两种处理,如果导出数据量小,比如小于5万条,可以在页面直接导出,如果需要导出的数据量大于5万,则采用异步方式,由用户提交导出申请,然后通过定时任务执行异步导出,导出完成后,用户可以看到并下载生成好的文件。

经过上述3个方面的改进,数据导出速度慢和闪退问题得到彻底解决。