业务场景
考虑到数据库数据日渐增多,导出会有全量数据的导出(甚至有的时候数据百万级),多人同时导出可以会对服务性能造成影响,导出涉及到mysql查询的io操作,还涉及文件输入、输出流的io操作,所以对服务器的性能会影响的比较大。因为需要控制频繁操作导出功能,优化用户体验。
解决方案
-
创建队列
维护一个FIFO(先进先出)的队列,用于存储需要进行导出操作的用户请求。设置队列大小:根据服务器性能和资源的情况,确定队列的大小,以限制同时进行导出操作的请求数量,防止造成服务性能下降。
@Slf4j
@Component
public class ExportQueue {
private final int MAX_CAPACITY = 10; // 队列最大容量
private LinkedList<ExportUser> queue; // 用户队列
public ExportQueue(LinkedList<ExportUser> queue) {
this.queue = new LinkedList<>();
}
/**
* 排队队列添加
* @param sysUser
*/
public synchronized LinkedList<ExportUser> add(ExportUser sysUser) {
while (queue.size() >= MAX_CAPACITY) {