当前位置: 首页 > news >正文

【3】高并发导出场景下,服务器性能瓶颈优化方案-文件压缩

     使用EasyExcel导出并压缩文件是一种高效且常见的解决方案,尤其适用于需要处理大量数据的场景。

1. 导出多个Excel文件并压缩成ZIP文件的基本流程

 (1)数据准备:从数据库或其他数据源获取需要导出的数据,并将其存储在Java对象中(如List<YourEntity>)。

(2)创建Excel文件:使用EasyExcel库将数据写入多个Excel文件。每个Excel文件可以对应一个Sheet表单。

(3)压缩文件:将生成的Excel文件打包成ZIP格式,通常通过ZipOutputStream实现。

(4)响应输出:将压缩后的ZIP文件作为附件返回给客户端或上传到文件服务器(如腾讯云COS)。

2. 具体实现方法

(1)依赖引入

在项目的pom.xml中添加EasyExcel依赖:

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.2</version>
</dependency>

该版本支持多种功能,包括流式写入、分批处理等。

(2)生成Excel文件

定义一个基础类(如UserData),并使用EasyExcel写入数据:

import lombok.Data;@Data
public class UserData {private Integer id;private String name;private Integer age;public UserData(Integer id, String name, Integer age) {this.id = id;this.name = name;this.age = age;}
}

定义一个对象,存放Excel文件名和文件流,压缩时使用 

import lombok.Data;import java.io.InputStream;@Data
public class ZipDto {public String name;public InputStream inputStream;public ZipDto(String name, InputStream inputStream) {this.name = name;this.inputStream = inputStream;}}

 生成excel文件

 public void exportUserData() {List<ZipDto> zipDtoList = new ArrayList<>();ZipDto zipDto = null;int pageNumber = 0;//每页查询数据库条数int PER_PAGE_SIZE =10000;com.alibaba.excel.ExcelWriter writer = null;WriteSheet sheet = null;try {while (true) {//分页从数据库加载业务数据List<UserData> list =baseMapper.findUserDataForExport(pageNumber * PER_PAGE_SIZE, PER_PAGE_SIZE);if (list.isEmpty()) {break;}ByteArrayOutputStream oi = new ByteArrayOutputStream();writer = EasyExcel.write(oi, UserData.class).build();sheet = EasyExcel.writerSheet(0).build();writer.write(list, sheet);writer.finish();zipDto = new ZipDto("用户信息" + DateUtil.now() + "-" + pageNumber + ".xlsx", new ByteArrayInputStream(oi.toByteArray()));zipDtoList.add(zipDto);if (list.size() < PER_PAGE_SIZE) {break;}pageNumber++;}if (CollUtil.isNotEmpty(zipDtoList)) {if (zipDtoList.size() == 1) {zipDto = zipDtoList.get(0);TencentCOSUtil.upLoad(zipDto.getInputstream(),"userData_" + DateUtil.format(new Date(), "yyyy-MM"),"xlsx");} else {ByteArrayOutputStream oi = new ByteArrayOutputStream();//将多个excel压缩为Zip文件ZipUtils.zipListStream(zipDtoList, oi);//如果集群部署,会导致文件下载失败,上传文件到云存储TencentCOSUtil.upLoad(new ByteArrayInputStream(oi.toByteArray()),"userData_" + DateUtil.format(new Date(), "yyyy-MM"), "zip");}}} catch (Exception e) {log.error("[exportUserData]导出失败:{}", e);} finally {if (writer != null) {writer.close();}}}

   TencentCOSUtil.upload(InputStream inputStream, String path, String suffix) 是将文件上传到腾讯云文件服务器。后续单独写一篇介绍如何上传文件到腾讯云

(3)压缩为Zip文件
 /*** 将多个流转成zip文件输出** @param listStream 文件流实体类对象* @param out        zip包的输出字节流* @return*/public static boolean zipListStream(List<ZipDto> listStream, ByteArrayOutputStream out) {boolean flag = false;BufferedInputStream bis = null;try (ZipOutputStream zos = new ZipOutputStream(out)) {for (ZipDto zipDto : listStream) {String fileName = zipDto.getName();// 创建ZIP实体,并添加进压缩包ZipEntry zipEntry = new ZipEntry(fileName);zos.putNextEntry(zipEntry);// 读取待压缩的文件并写进压缩包里bis = new BufferedInputStream(zipDto.getInputStream());byte[] buffer = new byte[1024];int len = 0;while ((len = bis.read(buffer)) != -1) {zos.write(buffer, 0, len);}}flag = true;} catch (Exception e) {log.error("[zipListStream]多个流转成zip文件异常",e);} finally {// 关闭流try {if (null != bis) {bis.close();}if (null != out) {out.close();}} catch (IOException e) {log.error(e.getMessage());}}return flag;}

3. 注意事项

  • 字符编码问题:在生成ZIP文件时,需确保文件名和内容的字符编码正确,避免中文乱码问题。

相关文章:

【3】高并发导出场景下,服务器性能瓶颈优化方案-文件压缩

使用EasyExcel导出并压缩文件是一种高效且常见的解决方案&#xff0c;尤其适用于需要处理大量数据的场景。 1. 导出多个Excel文件并压缩成ZIP文件的基本流程 &#xff08;1&#xff09;数据准备&#xff1a;从数据库或其他数据源获取需要导出的数据&#xff0c;并将其存储在Ja…...

FPGA|生成jic文件固化程序到flash

1、单击file-》convert programming files 2、flie type中选中jic文件&#xff0c;configuration decive里根据自己的硬件选择&#xff0c;单击flash loader选择右边的add device选项 3、选择自己的硬件&#xff0c;单击ok 4、选中sof选项&#xff0c;单机右侧的add file 5、选…...

【ArcGIS_Python】使用arcpy脚本将shape数据转换为三维白膜数据

说明&#xff1a; 该专栏之前的文章中python脚本使用的是ArcMap10.6自带的arcpy&#xff08;好几年前的文章&#xff09;&#xff0c;从本篇开始使用的是ArcGIS Pro 3.3.2版本自带的arcpy&#xff0c;需要注意不同版本对应的arcpy函数是存在差异的 数据准备&#xff1a;准备一…...

用Python获取股票数据并实现未来收盘价的预测

获取数据 先用下面这段代码获取上证指数的历史数据&#xff0c;得到的csv文件数据&#xff0c;为后面训练模型用的 import akshare as ak import pandas as pd# 获取上证指数历史数据 df ak.stock_zh_index_daily(symbol"sh000001")# 将数据保存到本地CSV文件 df.…...

Rust 所有权特性详解

Rust 所有权特性详解 Rust 的所有权系统是其内存安全的核心机制之一。通过所有权规则&#xff0c;Rust 在编译时避免了常见的内存错误&#xff08;如空指针、数据竞争等&#xff09;。本文将从堆内存与栈内存、所有权规则、变量作用域、String 类型、内存分配、所有权移动、Cl…...

Gateway路由匹配规则详解

在微服务架构中&#xff0c;Gateway作为请求的入口&#xff0c;扮演着至关重要的角色。它不仅负责路由转发&#xff0c;还具备安全、监控、限流等多种功能。其中&#xff0c;路由匹配规则是Gateway的核心功能之一&#xff0c;它决定了请求如何被正确地转发到目标服务。本文将详…...

项目实操:windows批处理拉取git库和处理目录、文件

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

前端开发知识梳理 - HTMLCSS

1. 盒模型 由内容区&#xff08;content&#xff09;、内边距&#xff08;padding&#xff09;、边框&#xff08;border&#xff09;和外边距&#xff08;margin&#xff09;组成。 &#xff08;1&#xff09;标准盒模型&#xff08;box-sizing默认值, content-box&#xff…...

nginx中的proxy_set_header参数详解

在使用 Nginx 作为反向代理服务器时&#xff0c;proxy_set_header 指令扮演着至关重要的角色。它允许我们自定义请求头信息&#xff0c;将客户端请求传递给上游服务器时&#xff0c;添加或修改特定的信息&#xff0c;从而实现更灵活的代理功能。本文将深入探讨 proxy_set_heade…...

MapReduce是什么?

MapReduce 是一种编程模型&#xff0c;最初由 Google 提出&#xff0c;旨在处理大规模数据集。它是分布式计算的一个重要概念&#xff0c;通常用于处理海量数据并进行并行计算。MapReduce的基本思想是将计算任务分解为两个阶段&#xff1a;Map 阶段和 Reduce 阶段。 Map 阶段&a…...

Text2Sql:开启自然语言与数据库交互新时代(3030)

一、Text2Sql 简介 在当今数字化时代&#xff0c;数据处理和分析的需求日益增长。对于众多非技术专业人员而言&#xff0c;数据库操作的复杂性常常成为他们获取所需信息的障碍。而 Text2Sql 技术的出现&#xff0c;为这一问题提供了有效的解决方案。 Text2Sql&#xff0c;即文…...

《图解设计模式》笔记(五)一致性

十一、Composite模式&#xff1a;容器与内容的一致性 像文件夹与文件一样&#xff0c;文件夹中可以放子文件夹与文件&#xff0c;再比如容器中可以放更小的容器和具体内容。 Composite模式&#xff1a;使容器与内容具有一致性&#xff0c;创造出递归结构。 Composite&#x…...

华为支付-免密支付接入免密代扣说明

免密代扣包括支付并签约以及签约代扣场景。 开发者接入免密支付前需先申请开通签约代扣产品&#xff08;即申请配置免密代扣模板及协议模板ID&#xff09;。 华为支付以模板维度管理每一个代扣扣费服务&#xff0c;主要组成要素如下&#xff1a; 接入免密支付需注意&#x…...

React组件中的列表渲染与分隔符处理技巧

React组件中的列表渲染与分隔符处理技巧 摘要问题背景解决方案分析方案一&#xff1a;数组拼接法方案二&#xff1a;Fragment组件方案三&#xff1a;动态生成key 关键技术点1. key的使用原则2. Fragment组件3. 性能优化 实战演练挑战1&#xff1a;动态分隔符样式挑战2&#xff…...

【Pytorch和Keras】使用transformer库进行图像分类

目录 一、环境准备二、基于Pytorch的预训练模型1、准备数据集2、加载预训练模型3、 使用pytorch进行模型构建 三、基于keras的预训练模型四、模型测试五、参考 现在大多数的模型都会上传到huggface平台进行统一的管理&#xff0c;transformer库能关联到huggface中对应的模型&am…...

快速了解 c++ 异常处理 基础知识

相关代码概览&#xff1a; #include<stdexcept>std::runtime_errorcatch (const std::runtime_error& e) e.what() 相信大家一定见过这些代码&#xff0c;那么这些代码具体什么意思呢&#xff1f;我们一起来看一下 知识精讲&#xff1a; 异常处理是C中非常重要…...

deepseek API 调用-python

【1】创建 API keys 【2】安装openai SDK pip3 install openai 【3】代码&#xff1a; https://download.csdn.net/download/notfindjob/90343352...

玩转Gin框架:Golang使用Gin完成登录流程

文章目录 背景基于Token认证机制简介常见的Token类型Token的生成和验证在项目工程里创建jwt.go文件根目录新建.env文件 创建登录接口 /loginToken认证机制的优点 背景 登录流程&#xff0c;相信大家都很熟悉的。传统网站采用session后端验证登录状态&#xff0c;大致流程如下&…...

Linux学习笔记16---高精度延时实验

延时函数是很常用的 API 函数&#xff0c;在前面的实验中我们使用循环来实现延时函数&#xff0c;但是使用循环来实现的延时函数不准确&#xff0c;误差会很大。虽然使用到延时函数的地方精度要求都不会很严格( 要求严格的话就使用硬件定时器了 ) &#xff0c;但是延时函数肯定…...

vue2:如何动态控制el-form-item之间的行间距

需求 某页面有查看和编辑两种状态: 编辑: 查看: 可以看到,查看时,行间距太大导致页面不紧凑,所以希望缩小查看是的行间距。 行间距设置 行间距通常是通过 CSS 的 margin 或 padding 属性来控制的。在 Element UI 的样式表中,.el-form-item 的下边距(margin-bottom)…...

为什么自动驾驶地铁离不开形式化方法?从法国B方法到上海15号线的实战解析

数学如何为自动驾驶地铁筑起安全屏障&#xff1a;从B方法到工业级验证的深度实践 当一列无人驾驶的地铁以80公里时速穿越隧道时&#xff0c;系统每毫秒需要处理200传感器信号、执行30余项控制决策。巴黎地铁14号线自1998年开通以来保持零重大事故记录&#xff0c;上海15号线全自…...

生成式AI系统“内容生成”合规:架构师如何避免“虚假信息”?附4个方法

生成式AI内容生成合规指南&#xff1a;架构师如何系统性规避虚假信息&#xff1f; 元数据框架 标题 生成式AI内容生成合规指南&#xff1a;架构师如何系统性规避虚假信息&#xff1f;——从理论到实践的4大核心策略 关键词 生成式AI合规, 虚假信息防范, 事实一致性, 架构设计, …...

MySQL数据库基础聚合函数

聚合函数...

大厂笔试面试八股文-算法-数组常考题-final

刷了200道数组题,笔试面试还是不会做?这10道搞懂就够了 刷了200道数组题,面试还是不会做? 问题不是你刷得不够多,而是没抓住核心套路。 我整理了35道大厂真题,发现其实就5个核心技巧。今天把最重要的10道题和背后的套路,全部分享给你。 offer直通车-大厂校招大礼包&#x…...

RSA2 - Writeup by AI

RSA2 - Writeup by AI 题目信息项目内容题目来源Bugku CTF题目类型Crypto (密码学)考点RSA 小指数攻击、Rabin 加密题目描述 给定 RSA 加密参数&#xff1a; 加密指数 e 2模数 N&#xff08;3072 位&#xff09;密文 c 要求解密得到 flag。 考点分析 核心知识点 RSA 小指数攻击…...

从“认怂”到“被看见”:flomo的产品设计哲学

当大多数笔记软件都在追求“大而全”时&#xff0c;有一款产品选择了一条完全不同的路。它不让你写标题&#xff0c;不支持复杂排版&#xff0c;甚至在官网上大大方方地列出“自己不擅长什么”。它的创始人说&#xff1a;“35岁再创业&#xff0c;我学会了认怂。”它就是flomo&…...

通过 Langchain 框架实现 ChatGPT 的使用

一. 简介Langchain 框架&#xff1a;LangChain 是一个开源框架&#xff0c;是一个让大语言模型&#xff08;如ChatGPT&#xff09;能连接外部工具、记忆对话、执行复杂任务的“智能助手”开发框架&#xff0c;解决了LLM应用开发中的各种工程化问题。# LangChain 的核心定位&…...

C++ ONNX Runtime推理踩坑记:为什么我的全局Session一Run就报ORT_RUNTIME_EXCEPTION?

C ONNX Runtime推理异常解析&#xff1a;全局Session与Env生命周期的陷阱 在C项目中使用ONNX Runtime进行模型推理时&#xff0c;许多开发者都遇到过这样一个令人困惑的场景&#xff1a;明明代码逻辑看起来完全正确&#xff0c;却在调用Session.Run()时突然抛出ORT_RUNTIME_EXC…...

DSQC346G 3HAB8101-8 机器人伺服驱动单元

DSQC346G 3HAB8101‑8 机器人伺服驱动单元介绍DSQC346G&#xff08;3HAB8101‑8&#xff09;是一款专用于工业机器人伺服系统的驱动单元&#xff0c;用于控制伺服电机的运动与输出&#xff0c;实现机器人关节或轴的精确位置、速度和力矩控制&#xff0c;是机器人驱动链中的核心…...

SDXL-Turbo实战教程:从A futuristic car到motorcycle的删改逻辑教学

SDXL-Turbo实战教程&#xff1a;从A futuristic car到motorcycle的删改逻辑教学 获取更多AI镜像 想探索更多AI镜像和应用场景&#xff1f;访问 CSDN星图镜像广场&#xff0c;提供丰富的预置镜像&#xff0c;覆盖大模型推理、图像生成、视频生成、模型微调等多个领域&#xff0c…...