序
业务要求系统一次性把业务数据导出来。
系统的为了稳定性考虑,限制数据的导出上限为10000,避免数据库卡死,网络卡死,页面无响应等问题。
实际上系统不支持大数据量导出,给业务带来了很大的麻烦。
本文将针对大数据导出进行方案分析现实现。
分析
目前做的系统的架构大致如下。
从框架来看,每一个层之前的交互都有超时间。
1:DB超时时间为60秒。
2:Biz与Service层是通过dubbo的,超时时限为120秒。有包大小的限制 8M。另外还有断路器。
3:nginx的超时为60秒。
以上都是支持大数据的支持的障碍,如果仅仅是为了一个导出功能,对在线系统做这么大动作的调整,风险太大了。
那么有没有更好的方案呢?答案是肯定的
使用前端导出excel
方案
1:用户点击“导出”按钮
2:ajax调用分页查询,获取第一页数量(包括 总数信息
)。
3:利前第2步获取的总数,按分每一页数量为10000计算,计算出需要获取次数N。
4:循环去获取数据。从第一页取到第N页。并把数据汇总。
5:使用js拼组excel ,并摸拟用户下载。
优点
1:修改无侵入性,框架与后台都不需要改动。
2:可以废除后台的导出服务的支持,与分页共用一个api,减少后台代码的冗余。
3:更具有可扩展性,前端可以直接调整pagesize来调优化下载性能。
实现
;
(function(define) {
'use strict';
define(function(require, exports, module) {
function ajaxGet(data) {
let returnRs;
let url = $context.$config.localDomain + "qgwsclaim/search";
$.ajax({
type: "GET",
async: false,
url: url,
data: data,
contentType: "application/json",
success: function(rs) {
returnRs = rs;
},
error: function(rs) {
alert('导出出错');
//去除遮罩层
loadingShow(false);
}
});
return returnRs;
}
function tableToExcel(data) {
//要导出的json数据
let header = {
"claimCode"</