Deixe o plano de fundo responder ao front end imediatamente, o front end não espera pelo processo de processamento
Descrição: há uma função de lembrete por e-mail no sistema de gerenciamento de tarefas de casa do aluno. Se não for processado, o front end irá aguardar o resultado da devolução e não exibirá um prompt de envio com sucesso até que o e-mail seja enviado.
1. Use tentar {} finalmente {} (será mais rápido)
try{
return ApiResult.success("发送成功");
}finally{
//发送邮件代码...
}
Use a instrução try {} finally {} para permitir que a instrução try retorne diretamente o resultado primeiro e, finalmente, execute o código de correspondência.
2. Use vários tópicos (retorne os resultados em segundos)
new thread(()->{
//发送邮件代码...
}).start();
return ApiResult.success("发送成功");
O código de envio de email originalmente executado pelo thread principal é entregue a outros threads para processamento, e o thread principal retorna o resultado diretamente.
Envie uma solicitação Ajax assim que a página for carregada
$(document).ready(function () {
//此处页面打开即请求api
$.ajax({
type: 'GET',
url: '/ssm/homework/getHomeWork',
dataType: "json",
async: false,
success: function (data) {
}
}
});
});
Eu costumava atualizar algumas vezes antes de exibir os dados. Acontece que estava adicionando async: false para alterar a solicitação assíncrona em uma solicitação síncrona. Eu costumava pensar que adicionar $ (document) .ready () pode ser carregado. Parâmetros Ajax detalhados
SpringBoot hot deployment
Adicione spring-boot-devtools em pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
Se você alterar o código, será necessário pressionar Ctrl + Shift + F9 para concluir a implantação ativa. Anteriormente, apenas saiba que devtools podem ser usados para implantação ativa. SpringBoot implementa implantação quente em IDEA
413 (Solicitar Entidade Muito Grande)
Ao fazer upload do arquivo, ele relatou 413 para
modificar o arquivo de configuração Nginx
server {
...
client_max_body_size 20m;
...
}
Você também pode modificar o arquivo de configuração do tomcat (modificado em application.properties)
server.tomcat.max-http-form-post-size=-1
Defina a capacidade máxima de solicitações de postagem como ilimitada
Otimize SQL
Criar índice
Otimize a declaração de limite
selecione * de operation_log 1 limit 3000000, 10;
select * from operation_log t, (selecionar id da ordem do operation_log pelo limite de id
3000000,10) b onde t.id = b.id;
Método de download de arquivo
1. Usando o tipo ResponseEntity fornecido por springmvc, você pode usá-lo para definir facilmente os HttpHeaders e HttpStatus retornados. (Único arquivo)
@RequestMapping("/download")
public ResponseEntity<byte[]> export(String fileName,String filePath) throws IOException {
HttpHeaders headers = new HttpHeaders();
File file = new File(filePath);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
headers.setContentDispositionFormData("attachment", fileName);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
headers, HttpStatus.CREATED);
}
2. Baixe e empacote vários arquivos em um pacote zip
//批量文件压缩后下载
@RequestMapping("/downLoad2")
public ResponseEntity<byte[]> download2(HttpServletRequest request) throws IOException {
//需要压缩的文件
List<String> list = new ArrayList<String>();
list.add("test.txt");
list.add("test2.txt");
//压缩后的文件
String resourcesName = "test.zip";
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream("D:/"+resourcesName));
InputStream input = null;
for (String str : list) {
String name = "D:/"+str;
input = new FileInputStream(new File(name));
zipOut.putNextEntry(new ZipEntry(str));
int temp = 0;
while((temp = input.read()) != -1){
zipOut.write(temp);
}
input.close();
}
zipOut.close();
File file = new File("D:/"+resourcesName);
HttpHeaders headers = new HttpHeaders();
String filename = new String(resourcesName.getBytes("utf-8"),"iso-8859-1");
headers.setContentDispositionFormData("attachment", filename);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);
}
Código de front-end:
1. Use a solicitação Ajax
<button type="button" onclick="download()">导出</button>
function download() {
var url = 'download/?filename=aaa.txt';
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true); // 也可以使用POST方式,根据接口
xhr.responseType = "blob"; // 返回类型blob
// 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
xhr.onload = function () {
// 请求完成
if (this.status === 200) {
// 返回200
var blob = this.response;
var reader = new FileReader();
reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href
reader.onload = function (e) {
// 转换完成,创建一个a标签用于下载
var a = document.createElement('a');
a.download = 'data.xlsx';
a.href = e.target.result;
$("body").append(a); // 修复firefox中无法触发click
a.click();
$(a).remove();
}
}
};
// 发送ajax请求
xhr.send()
}
2. Envie usando formulários ocultos (recomendado)
var form = $("<form>");
form.attr("style","display:none");
form.attr("target","");
form.attr("method","post");
form.attr("action",rootPath + "T_academic_essay/DownloadZipFile.do");
var input1 = $("<input>");
input1.attr("type","hidden");
input1.attr("name","strZipPath");
input1.attr("value",strZipPath);
$("body").append(form);
form.append(input1);
form.submit();
form.remove();