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

岳阳网站建设哪里有网站免费正能量软件下载

岳阳网站建设哪里有,网站免费正能量软件下载,极速蜂app拉新加盟,河南公司网站可以做天津备案吗业务分析 内部平台需要一个导出mysql数据到excel的方法,所以使用了EasyExcel 因为EasyExcel的sheet页是放到一个List里面的,如果把百万量级的数据放到sheet页中全量写入会有OOM风险,所以最终选择的方案是分sheet页写入 同时因为该平台是多…

业务分析

内部平台需要一个导出mysql数据到excel的方法,所以使用了EasyExcel

因为EasyExcel的sheet页是放到一个List里面的,如果把百万量级的数据放到sheet页中全量写入会有OOM风险,所以最终选择的方案是分sheet页写入

同时因为该平台是多用户的,所以不仅要控制当前方法的sheet页的总量,还要估算多用户场景下sheet页加起来的量大小,如果规定每个写入的sheet页的量级为50w,那么10个用户并行导出的时候是不是500w的量级?

那就会出现OOM问题,为了严格控制sheet页的和总量,就要细致化到控制每个线程的每次写入的sheet页的量

为了优化多线程,还可以上深分页优化来进一步优化

多优化逻辑:线程+多sheet页+深分页


代码逻辑解析

我会开3个线程,然后sheet页按照10w为一批写入,3个线程就是30w

0-30w就用主线程,30w-60w就用两个线程,60w以后就用3个线程

本次要导出的是90w量级的数据,我们严格控制sheet也就是每次写入的一批数据量batchSize为10w

导出数据总量、每批数据量,算出写入sheet页的总批次

总批次/要开启的线程数,得到每个线程要写入的批次

有3个线程,每个线程的第一次查询要拿到第一批的数据的最后一个数据的id(sql是根据id排序的)

SQL: @Select("select * from excel where id >#{lastMaxId} order by id limit #{batchsize} ")

然后每个线程除了第一次查询,其他查询都可以优化深分页

为什么我要写入多个文件而不是多线程写入一个文件?

首先我尝试并发写同一个文件,然后报错了,因为文件是不能并发写的,多线程写入会导致文件烂掉然后再也打不开

然后我想到了我们多线程写不同的文件,然后通过python脚本去合并多个sheet页和多个xsml文件

有个小问题就是xsml文件本身的问题:一个sheet页最多只能写入,所以文件本身就会有限制,这就是为什么要写入多个文件和多个sheet页最终合并文件和sheet页


测试类代码

package com.example.kiratest.test.Excel;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.example.kiratest.EasyExcel.Mapper.ExcelMapper;
import com.example.kiratest.EasyExcel.pojo.Excel;
import com.github.pagehelper.PageHelper;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
//并发写同一个文件
@SpringBootTest
@Slf4j
public class MutiExcelTest {@Resourceprivate ExcelMapper excelMapper;@ResourceMap<String, ThreadPoolExecutor> ThreadPoolMap;@Testpublic void getData() throws InterruptedException {ThreadPoolExecutor easyExcelThreadPool = ThreadPoolMap.get("EasyExcelThreadPool");//拿到线程池int pageSize = 100000;//10w为一批Integer total = excelMapper.countTotal();//统计数据总数log.info("总数:{}",total);//batchSize<3,用一个线程,6就是2个线程,9就是3个线程int batchSize = (int) Math.ceil((double) total / pageSize);//一共要执行的批次log.info("batchSize:{}",batchSize);int everythreadSize = batchSize / 3;//一共开三个线程,每个线程应该负责多少批次int threadCount = 1; // 主线程if (batchSize > 3 && batchSize < 6) threadCount += 1;else if (batchSize > 6) threadCount += 2;CountDownLatch countDownLatch = new CountDownLatch(threadCount);//开始EasyExcel写入String filePath = "C:\\Users\\ziJian.zheng\\IdeaProjects\\Kira-Test\\src\\main\\resources\\templates\\test1.xlsx";//用来写入的ExcelWriterExcelWriter writer = EasyExcel.write(filePath).build();//
//
////开启异步线程if (batchSize > 3 ) {easyExcelThreadPool.execute(() -> {try {//用来写入的ExcelWriterExcelWriter writer1 = EasyExcel.write(filePath).build();int first = everythreadSize + 1;//作为sheet页标识,也就是批次标识Integer lastId = null;//多Sheet写入for (int i = 0; i < everythreadSize; i++) {WriteSheet sheet = EasyExcel.writerSheet("批次" + first++).build();if (i == 0) {//也就是我们的第一次写入PageHelper.startPage(everythreadSize+1,pageSize);//第一次普通的分页查询,后面要知道id,使用书签法来优化深度分页问题List<Excel> excels = excelMapper.selectAllOrderById();if (excels.size() > batchSize)lastId = excels.get(excels.size() - 1).getId();log.info("LastId:{}",lastId);writer1.write(excels, sheet);} else { //我们的书签法优化List<Excel> excels = excelMapper.deepPaginationSelect(lastId, pageSize);lastId = excels.get(excels.size() - 1).getId();log.info("LastId:{}",lastId);writer1.write(excels, sheet);}}writer1.finish();} finally {countDownLatch.countDown();}});}if (batchSize > 6) {easyExcelThreadPool.execute(() -> {try {//用来写入的ExcelWriterExcelWriter writer2 = EasyExcel.write(filePath).build();int first = 2*everythreadSize + 1;//作为sheet页标识,也就是批次标识Integer lastId = null;//多Sheet写入for (int i = 0; i < everythreadSize; i++) {WriteSheet sheet = EasyExcel.writerSheet("批次" + first++).build();if (i == 0) {//也就是我们的第一次写入PageHelper.startPage(everythreadSize*2+1,pageSize);//第一次普通的分页查询,后面要知道id,使用书签法来优化深度分页问题List<Excel> excels = excelMapper.selectAllOrderById();if (excels.size() > batchSize)lastId = excels.get(excels.size() - 1).getId();log.info("LastId:{}",lastId);writer2.write(excels, sheet);} else { //我们的书签法优化List<Excel> excels = excelMapper.deepPaginationSelect(lastId, pageSize);lastId = excels.get(excels.size() - 1).getId();log.info("LastId:{}",lastId);writer2.write(excels, sheet);}}writer2.finish();} finally {countDownLatch.countDown();}});}//主线程执行try {int first = 0;//作为sheet页标识,也就是批次标识Integer lastId = null;//多Sheet写入for (int i = 0; i < everythreadSize; i++) {WriteSheet sheet = EasyExcel.writerSheet("批次" + first++).build();if (i == 0) {//也就是我们的第一次写入PageHelper.startPage(1, pageSize);//第一次普通的分页查询,后面要知道id,使用书签法来优化深度分页问题List<Excel> excels = excelMapper.selectAllOrderById();if (excels.size() > batchSize)lastId = excels.get(excels.size() - 1).getId();log.info("LastId:{}",lastId);writer.write(excels, sheet);} else { //我们的书签法优化List<Excel> excels = excelMapper.deepPaginationSelect(lastId, pageSize);lastId = excels.get(excels.size() - 1).getId();log.info("LastId:{}",lastId);writer.write(excels, sheet);}}}finally {writer.finish();countDownLatch.countDown();}countDownLatch.await();log.info("导出结束");}@Testvoid test(){List<Excel> excels = excelMapper.deepPaginationSelect(100, 1000);System.out.println(excels);}}

Mapper

package com.example.kiratest.EasyExcel.Mapper;import com.example.kiratest.EasyExcel.pojo.Excel;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface ExcelMapper {@Select("select * from excel order by id")List<Excel> selectAllOrderById();  //查询数据根据id排序,如果这个要分页的话我们就是用我们的PageHelper@Select("select count(*) from excel")Integer countTotal();@Select("select * from excel where id >#{lastMaxId} order by id limit #{batchsize} ")List<Excel> deepPaginationSelect(Integer lastMaxId,Integer batchsize); //深度分页通过书签法解决}

POJO类

package com.example.kiratest.EasyExcel.pojo;import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.util.Date;@Data
@AllArgsConstructor
@NoArgsConstructor
@ColumnWidth(20)
public class Excel {@ExcelIgnoreprivate Integer id;@ExcelProperty(value = "用户姓名",index = 0)private String name;@ExcelProperty(value = "用户Id",index = 1)private String uesrId;@ExcelProperty(value = "居住地址",index = 2)private String location;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")private Date createTime;
}

文章转载自:

http://lgbBZSqx.nyjgm.cn
http://0eeB85vs.nyjgm.cn
http://pPy2AH2H.nyjgm.cn
http://qqoYiF4q.nyjgm.cn
http://WxaOMwXs.nyjgm.cn
http://2KOOgJ3k.nyjgm.cn
http://fGZpald4.nyjgm.cn
http://eKyQgoJM.nyjgm.cn
http://szDCkjjR.nyjgm.cn
http://kYwwXYM1.nyjgm.cn
http://LWcsQfJ4.nyjgm.cn
http://x3ePU8CT.nyjgm.cn
http://DtYAQUtE.nyjgm.cn
http://Wiwx4A1M.nyjgm.cn
http://6RH9Lz4d.nyjgm.cn
http://EqBQMxXD.nyjgm.cn
http://wk4h3HMh.nyjgm.cn
http://oe9uuzYJ.nyjgm.cn
http://wipMS6s6.nyjgm.cn
http://vjdtp2s7.nyjgm.cn
http://DHsbtNyr.nyjgm.cn
http://BoNjSgz3.nyjgm.cn
http://Fu0DKlth.nyjgm.cn
http://vkxV9zig.nyjgm.cn
http://FBKco61Z.nyjgm.cn
http://6TwtGlQQ.nyjgm.cn
http://YDhkRSCz.nyjgm.cn
http://fNE4eoxe.nyjgm.cn
http://VVIhosGo.nyjgm.cn
http://Xp0wna8t.nyjgm.cn
http://www.dtcms.com/wzjs/697220.html

相关文章:

  • 网站建设的方法和技术知名小蚁人网站建设
  • 上海做手机网站建设建立外贸网站多少钱
  • 网件路由器刷机南昌seo营销
  • 如何去建设一个企业网站广告营销专业
  • 网站开发毕业设计参考文献湛江网页定制
  • 保定高端网站建设移动wap是什么意思
  • vr 网站怎么做的甘肃谷歌seo
  • 购物网站排名湖南营销型网站
  • 微商需要做网站吗长沙关键词优化方法
  • 北京企业网站建设费用wordpress xml 导入失败
  • 韩城市住房和城乡建设局网站郑州七彩网站建设公司
  • 二级域名免费网站怎么申请wordpress改造seo
  • 稿定设计网站官网入口有网站公司源码可以重建网站吗
  • 北京最新网站备案苏州官网建站
  • 网站优化自己可以做吗企业馆展厅设计公司
  • 深度网营销型网站建设搭建网站要哪些知识
  • 网站建设 选猴王网络模版网站系统
  • 郑州网站推广公司站优云网络公司
  • 葫芦岛做网站价格网站优化及推广方案
  • 做网站做什么主题风中有朵雨做的云网站观看
  • 张家港网站推广建立网站的公司有哪些
  • 重庆设计网站网络营销推广的要点及注意事项
  • 辽宁省城乡和建设厅网站wordpress主题更新了
  • 旅行社网站营销建设网站建设 成本
  • 万网网站建设步骤自己怎么注册域名
  • 境外网站建设使用nas建设网站
  • 张店免费做网站济宁网站建设seo
  • 网站系统繁忙怎么办wordpress 分享 插件
  • 用花生壳做映射的网站需要备案河北网站建设模板
  • 重庆网站优化排名软件方案备案名称和网站名称