概述
对于超大数据量的导出是一个长耗时的操作。在没有进度条情况下,当用户点击导出后,页面长时间得不到反馈,导致用户不清楚是导出出现问题,还是导出正在进行处理还未结束。所以,为超大数据量的导出添加进度条功能显得尤为必要。
下面以导出10000000手机号数据为例,开发带进度条的导出功能。
需求分析
- 进度条分析
文件的导出有两个阶段,一是查询数据库生成数据文件;二是数据文件下载。对于数据文件的下载各大浏览器都可以很好的显示下载进度,不需要添加进度条。所以,进度条展示的是一阶段查询数据库生成数据文件的进度,对于超大数据量生成文件的过程会持续很长的时间,此处使用进度条展示非常合适。
- 超大数据量导出查询数据分析
对于超大数据量的查询采用的基本方案为,先查询总数据量数,根据设置每次查询条数计算出需要查询的次数,然后分页查询将查询结果动态写入数据文件,在将数据文件以流的形式输出给浏览器。
传统方式导出开发
传统方式不使用进度条展示导出进度,导出效果如下:
- 页面代码如下:
<form action="download" method="post">
<input type="submit" value="导出">
</form>
- Java后端导出处理,代码如下:
其中导出文件暂存/tmp
目录下
public void download() throws IOException {
final String fileName = UUID.randomUUID().toString().replace("-","");
try (final FileWriter fileWriter = new FileWriter(new File("/tmp/" + fileName + ".csv"));
final BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);){
final long totalNum = remoteGetUserNum();
final long pageSize = 100L ;
long totalPage = (totalNum%pageSize == 0L) ? totalNum/pageSize:(totalNum/pageSize + 1);
for (long pageNum = 1L; page