プロジェクトのシナリオ:
テスト サーバーの状況: サーバーのメモリは 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
}
要約する
一般的に言えば、問題は解決できますが、解決策はあまり良くないと感じています. より良い解決策があれば、コメント欄に書いてください.