vue2 Excel 导出数据量太大导致OOM问题及解决方案

项目场景:

测试服服务器情况:我们服务器是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
  }

总结

总的来说是可以解决了问题,但是感觉方案不是很好,若大佬们有更好的解决方案,欢迎在评论区提出。

猜你喜欢

转载自blog.csdn.net/qq_44697754/article/details/129380106