Vue2 Excel がエクスポートするデータが多すぎて、OOM の問題と解決策が発生する

プロジェクトのシナリオ:

テスト サーバーの状況: サーバーのメモリは 8g、管理および API プロジェクトは 3g、mysql は約 1g、Mycat は 2g です。

機器モジュールはマルチテーブル操作を含み、その後 VO に転送してフロント エンドに戻り、前のセクションのデータを変更した後にデータを表示します。複数テーブルのクエリが含まれるため、クエリの効率は悪くありません。
ここに画像の説明を挿入

問題の説明

[Excel のエクスポート] をクリックすると、クエリの条件に従ってデータがエクスポートされます.たとえば、時間間隔の増加に伴ってクエリの時間が増加し、データの量も増加します.エクスポートされるのはすべてです.データが比較的小さい場合、フリーズまたはリクエスト タイムアウトが発生し、データ量が非常に大きい場合、リクエスト タイムアウトまたはサーバー ダウンタイム (スタック) が発生します。

解決:

問題の分析には多くの理由がありますが、主な問題は、要求によって決定され、変更できない派生条件の問題です。
解決策:クエリ条件をセグメントでクエリします. たとえば、現在のクエリ データには 20,000 を超えるデータがあります. セグメント化されたクエリによると, たとえば、1 ページあたり 100/500/1000 行のデータ クエリの場合, これにより、リクエストによるサーバーへのプレッシャーはありますが、リクエストの量はさまざまです。

ビューコード:

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