O Vue2 Excel exporta muitos dados para causar problemas e soluções OOM

Cenário do projeto:

Situação do servidor de teste: nosso servidor tem 8g de memória, projetos de administração e API ocupam 3g, mysql ocupa cerca de 1g e Mycat ocupa 2g.

O módulo de equipamento envolve operações de várias mesas e, em seguida, transfere para VO para retornar ao front-end e exibe os dados após modificar os dados na seção anterior. Por envolver consulta em várias tabelas, a eficiência da consulta não é ruim.
insira a descrição da imagem aqui

Descrição do Problema

Ao clicar em Exportar Excel, os dados serão exportados de acordo com as condições da consulta. Por exemplo, o tempo de consulta aumentará com o aumento do intervalo de tempo e a quantidade de dados também aumentará. Exportado é tudo. Se a quantidade de os dados forem relativamente pequenos, isso causará congelamentos ou timeout da solicitação, se a quantidade de dados for muito grande, causará timeout da solicitação ou tempo de inatividade do servidor (travado).

solução:

Existem muitas razões para a análise do problema, mas o principal problema é o problema da condição derivada, que é determinada pela demanda e não pode ser alterada.
Solução: Consultamos as condições da consulta em segmentos. Por exemplo, os dados da consulta atual têm mais de 20.000 dados. De acordo com a consulta segmentada, por exemplo, 100/500/1000 linhas de consulta de dados por página, isso reduzirá o pressão no servidor do pedido, mas O volume de pedidos irá variar.

código visual:

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
  }

Resumir

De um modo geral, o problema pode ser resolvido, mas sinto que a solução não é muito boa.Se você tiver uma solução melhor, sinta-se à vontade para colocá-la na área de comentários.

Acho que você gosta

Origin blog.csdn.net/qq_44697754/article/details/129380106
Recomendado
Clasificación