项目场景:
测试服服务器情况:我们服务器是8g内存,Admin 和 API 两项目占 3g,mysql 占1g左右,Mycat 占 2g。
设备模块涉及到多表操作,然后转VO到返回前端,前段对数据进行修饰后进行展示数据。因为涉及到多表查询,查询效率还行。
问题描述
当点击导出Excel,会根据查询条件导出数据,比如,查询时间,会随着时间间隔的增大,数据量也会变多,已导出就是全部,若数据量相对较少,会导致卡顿或者请求超时,若数据量非常多,会导致请求超时或服务器宕机(卡死)。
解决方案:
分析出问题的原因有很多,但主要问题还是导出条件的问题,这是需求定的,也不能改。
方案: 我们将查询条件分段查,比如当前查询数据有 2万多条数据,根据分段查,例如每页查100/500/1000行数据查询,这样会减轻了请求对服务器的压力,但是请求量会变会多。
vue代码:
async findHospitalReportExport (params) {
// 获取导出数据的标题头
let exlTemplate = await postRequest('/oauth2_api/doctor_report/find_hospital_report_export.json', params)
// 配置分段查询语条件
let pageableExcel = {
pageNumber: 1,
pageSize: 100,
totalPages: 0,
total: 0,
filter: {
searchType: 'hospitalName',
searchValue: '',
area_saleChanelId: null,
myStartTime: null,
myEndTime: null
}
}
pageableExcel.pageNumber = 1
pageableExcel.pageSize = 100
pageableExcel.filter = params.filter
let tableData = []
// 获取导出文件
if (emptyUtil.isNotBlank(exlTemplate) && exlTemplate.code === '1' && emptyUtil.isNotBlank(exlTemplate.object)) {
// 获取导出数据
do {
// 分段查询数据请求
let doctorReportData = await this.findHospitalReportPage(pageableExcel)
if (emptyUtil.isNotBlank(doctorReportData) && doctorReportData.code === '1' && emptyUtil.isNotBlank(doctorReportData.object)) {
// 数据回填
pageableExcel.pageNumber = doctorReportData.object.pageNumber + 1
pageableExcel.totalPages = doctorReportData.object.totalPages
pageableExcel.pageSize = doctorReportData.object.pageSize
let doctorReportList = doctorReportData.object.content
if (emptyUtil.arrayIsNotBlank(doctorReportList)) {
doctorReportList.forEach(doctorReport => {
// 数据添加数据
tableData.push(doctorReport)
})
}
}
// 当前页数是否小于分页查询的总页数
} while (pageableExcel.pageNumber <= pageableExcel.totalPages)
}
exlTemplate.object.tableData = tableData
// 返回数据
return exlTemplate
}
总结
总的来说是可以解决了问题,但是感觉方案不是很好,若大佬们有更好的解决方案,欢迎在评论区提出。