• 一次网页分页参数设置错误导致的下载Bug分析
  • 发布于 3天前
  • 181 热度
    0 评论
有一天下午突然收到销售助理给反馈的问题,明明列表中有115300条数据,但是用下载按钮下载的Excel表格只有10000条数据。奇怪了,怎么会出现这种情况。

1、找根源
由于是老项目,先从前端页面找,F12浏览器查看JS源码,下载是采用js的ajax请求,点击浏览器调试模式中的网络重新运行下载,仔细检查请求的json参数,发现参数跟列表完全一致,没有问题,这是几年前的老项目了,这可怎么办,只能打开老项目来查看源码了。费劲打开项目,找到列表页面中的下载按钮,查看js中的ajax请求的文件及方法名称,找到方法后发现也没有问题,按F5进入调试模式,第一次调试结果显示参数正确,第二次调试发现有个pagesize=10000的参数,原来下载的方法跟列表的方法用的是同一个,可能是前辈为了工作效率,直接把分页的条数写成10000条,原来的数据可能不超过10000,终于找到原因了,接下来考虑怎么优化了。

2、优化
下载优化的方法有很多,这里列出几个方案:
方案一,直接把pagesize的值改成100万,这种做法改起来很快,但是给后面的开发者挖了一个坑,不推荐这样做;性能测了一下,导出用了25秒。

方案二,可以把每次下载的内容用文件缓存起来,文件名可以通过下载的搜索条件MD5,如果下次下载同样搜索条件的就判断文件是否存在,这种做法的优点是下载速度快,缺点是如果数据是可变数据就会造成数据不准确,数据发生变化如何更新是个问题。

方案三,可以用分页的方法一页一页的取出数据,然后再组装成一个集合,传递给Excel组件NPOI导出。这样做的优点是按照分页导出速度快,缺点是要写分页的算法,并且不知道具体的页数。

最终选择了方案三,用while循环,不用知道具体多少数据,通过计算最后一页如果小于每页数量或者为0就停止循环。代码如下:
bool isTrue =true;//是否运行
Page.Pagesize= 1000;//每页条数
DataPager<ProjectExend> dataPage = new DataPager<ProjectExend>();
int page = 0;
while (isTrue)
 {
      page++;
      Page.Start = (page-1)* Page.Pagesize+1;//查询开始索引
var relItems = bll.GetProjectList(Page).Items;
//添加到集合
      dataPage.Items.AddRange(relItems);
      //计算找出最后一页
      endsizenum= relItems.Count= Page.Pagesize;
 }
实验了一下,5秒导出数据,效率得到明显提升。

结语
如果你有更加优秀的方法,欢迎留言讨论。
用户评论