第一次写博客,非喜勿喷哦
最近在做库存对比工具,将对比结果导出csv下载,这个对比过程非常长,数据量很大,导致服务器一直在等待后台响应,然后504,
下面是我解决这个问题的过程,希望大家不要踩坑;
1.修改net.core.somaxconn的值;
此解决方案是在阿里云帮助文档看见的;
想连接很多关于net.core.somaxconn 的信息,转此处
https://blog.csdn.net/mawming/article/details/51952411
net.core.somaxconn是Linux中的一个kernel参数,表示socket监听(listen)的backlog上限。什么是backlog呢?backlog就是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。
解决方法:默认的net.core.somaxconn
的值为128,执行sysctl -w net.core.somaxconn=1024
更改它的值,重启tomcat,看问题是否解决,如还未解决,接着往下看;
2.优化后端导出方案;
a.后端导出数据,由多步变一步,尽量压缩执行时间;
b.更改导出数据方式,由一次性执行完成后生成文件,返回流给浏览器的方式变为持续性的写出流到浏览器;
b方案的实现:
首先感谢这位大佬提供的小工具,非常感谢;
https://blog.csdn.net/pipi_7/article/details/70141054
由于大佬提供了工具并未提供demo,所以我摸索了会儿基于他实现了我想要的结果;
大佬的博客里面这个工具的使用已经说得很明白了,我只提供我代码部分:
0.在Controller里初始化工具类对象,然后传入业务层进行数据操作;
1.工具类初始化需要传入响应对象,表头字段的Map(与封装对象字段对应起),文件名,封装对象字节码对象;
2.这是封装类
3.业务层代码实现;
a.定义一个集合,封装数据对象(由于我一次对比会产生多个导出对象,所以定义一个集合,你们可以根据实际情况来定义)
b.添加数据对象到集合;
c.一次循环完成,导出数据;
b.所有数据导出完成(我是for循环完成后),调用工具类close方法,关流;
下面是结果,不会出现504了,等待后台所有数据对比完成后,会自动下载csv文件;
下载完成;
完美解决!
感谢:
https://blog.csdn.net/mawming/article/details/51952411
https://blog.csdn.net/pipi_7/article/details/70141054