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.
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.