成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Excel高性能導入方案!你學會了嗎?

開發 前端
今天要討論一個讓無數人抓狂的話題:如何高效導入百萬級Excel數據。去年有家公司找到我,他們的電商系統遇到一個致命問題:每天需要導入20萬條商品數據,但一執行就卡死,最長耗時超過3小時。

前言

今天要討論一個讓無數人抓狂的話題:如何高效導入百萬級Excel數據。

去年有家公司找到我,他們的電商系統遇到一個致命問題:每天需要導入20萬條商品數據,但一執行就卡死,最長耗時超過3小時。

更魔幻的是,重啟服務器后前功盡棄。

經過半天的源碼分析,我們發現了下面這些觸目驚心的代碼...

1.為什么傳統導入方案會崩盤?

很多小伙伴在實現Excel導入時,往往直接寫出這樣的代碼:

// 錯誤示例:逐行讀取+逐條插入
public void importExcel(File file) {
    List<Product> list = ExcelUtils.readAll(file); // 一次加載到內存
    for (Product product : list) {
        productMapper.insert(product); // 逐行插入
    }
}

這種寫法會引發三大致命問題:

1.1 內存熔斷:堆區OOM慘案

  • 問題:POI的UserModel(如XSSFWorkbook)一次性加載整個Excel到內存
  • 實驗:一個50MB的Excel(約20萬行)直接耗盡默認的1GB堆內存
  • 癥狀:頻繁Full GC ? CPU飆升 ? 服務無響應

1.2 同步阻塞:用戶等到崩潰

  • 過程:用戶上傳文件 → 同步等待所有數據處理完畢 → 返回結果
  • 風險:連接超時(HTTP默認30秒斷開)→ 任務丟失

1.3 效率黑洞:逐條操作事務

  • 實測數據:MySQL單線程逐條插入≈200條/秒 → 處理20萬行≈16分鐘
  • 幕后黑手:每次insert都涉及事務提交、索引維護、日志寫入

2.性能優化四板斧

第一招:流式解析

使用POI的SAX模式替代DOM模式:

// 正確寫法:分段讀取(以HSSF為例)
OPCPackage pkg = OPCPackage.open(file);
XSSFReader reader = new XSSFReader(pkg);
SheetIterator sheets = (SheetIterator) reader.getSheetsData();

while (sheets.hasNext()) {
    try (InputStream stream = sheets.next()) {
        Sheet sheet = new XSSFSheet(); // 流式解析
        RowHandler rowHandler = new RowHandler();
        sheet.onRow(row -> rowHandler.process(row));
        sheet.process(stream); // 不加載全量數據
    }
}

?? 避坑指南

  • 不同Excel版本需適配(HSSF/XSSF/SXSSF)
  • 避免在解析過程中創建大量對象,需復用數據容器

第二招:分頁批量插入

基于MyBatis的批量插入+連接池優化:

// 分頁批量插入(每1000條提交一次)
public void batchInsert(List<Product> list) {
    SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
    ProductMapper mapper = sqlSession.getMapper(ProductMapper.class);
    
    int pageSize = 1000;
    for (int i = 0; i < list.size(); i += pageSize) {
        List<Product> subList = list.subList(i, Math.min(i + pageSize, list.size()));
        mapper.batchInsert(subList);
        sqlSession.commit();
        sqlSession.clearCache(); // 清理緩存
    }
}

關鍵參數調優

# MyBatis配置
mybatis.executor.batch.size=1000

# 連接池(Druid)
spring.datasource.druid.maxActive=50
spring.datasource.druid.initialSize=10

第三招:異步化處理

架構設計:

圖片圖片

  1. 前端上傳:客戶端使用WebUploader等分片上傳工具
  2. 服務端
  • 生成唯一任務ID
  • 寫入任務隊列(Redis Stream/RabbitMQ)
  1. 異步線程池
  • 多線程消費隊列
  • 處理進度存儲在Redis中
  1. 結果通知:通過WebSocket或郵件推送完成狀態

第四招:并行導入

對于千萬級數據,可采用分治策略:

階段

操作

耗時對比

單線程

逐條讀取+逐條插入

基準值100%

批處理

分頁讀取+批量插入

時間降至5%

多線程分片

按Sheet分片,并行處理

時間降至1%

分布式分片

多節點協同處理(如Spring Batch集群)

時間降至0.5%

3 代碼之外的關鍵經驗

3.1 數據校驗必須前置

典型代碼缺陷:

// 錯誤:邊插入邊校驗,可能污染數據庫
public void validateAndInsert(Product product) {
    if (product.getPrice() < 0) {
        throw new Exception("價格不能為負");
    }
    productMapper.insert(product);
}

正確實踐

  1. 在流式解析階段完成基礎校驗(格式、必填項)
  2. 入庫前做業務校驗(數據關聯性、唯一性)

3.2 斷點續傳設計

解決方案:

  • 記錄每個分片的處理狀態
  • 失敗時根據偏移量(offset)恢復

3.3 日志與監控

配置要點:

// Spring Boot配置Prometheus指標
@Bean
public MeterRegistryCustomizer<PrometheusMeterRegistry> metrics() {
    return registry -> registry.config().meterFilter(
        new MeterFilter() {
            @Override
            public DistributionStatisticConfig configure(Meter.Id id, DistributionStatisticConfig config) {
                return DistributionStatisticConfig.builder()
                    .percentiles(0.5, 0.95) // 統計中位數和95分位
                    .build().merge(config);
            }
        }
    );
}

四、百萬級導入性能實測對比

測試環境:

  • 服務器:4核8G,MySQL 8.0
  • 數據量:100萬行x15列(約200MB Excel)

方案

內存峰值

耗時

吞吐量

傳統逐條插入

2.5GB

96分鐘

173條/秒

分頁讀取+批量插入

500MB

7分鐘

2381條/秒

多線程分片+異步批量

800MB

86秒

11627條/秒

分布式分片(3節點)

300MB/節點

29秒

34482條/秒

總結

Excel高性能導入的11條軍規:

  1. 決不允許全量加載數據到內存 → 使用SAX流式解析
  2. 避免逐行操作數據庫 → 批量插入加持
  3. 永遠不要讓用戶等待 → 異步處理+進度查詢
  4. 橫向擴展比縱向優化更有效 → 分片+分布式計算
  5. 內存管理是生死線 → 對象池+避免臨時大對象
  6. 合理配置連接池參數 → 杜絕瓶頸在數據源
  7. 前置校驗絕不動搖 → 臟數據必須攔截在入口
  8. 監控務必完善 → 掌握全鏈路指標
  9. 設計必須支持容災 → 斷點續傳+冪等處理
  10. 拋棄單機思維 → 擁抱分布式系統設計
  11. 測試要覆蓋極端場景 → 百萬數據壓測不可少

如果你正在為Excel導入性能苦惱,希望這篇文章能為你的系統打開一扇新的大門。


責任編輯:武曉燕 來源: 蘇三說技術
相關推薦

2022-05-26 08:01:44

Pnpm包管理器磁盤

2023-01-26 00:28:45

前端測試技術

2024-01-19 08:25:38

死鎖Java通信

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-01-10 08:43:15

定義DDD架構

2024-06-26 00:20:42

2022-09-12 08:01:21

GreatSQLMySQL性能

2024-09-27 19:39:27

2023-03-09 11:34:00

項目CMakeST

2023-10-10 11:04:11

Rust難點內存

2024-05-06 00:00:00

InnoDBView隔離

2024-07-31 08:39:45

Git命令暫存區

2023-01-30 09:01:54

圖表指南圖形化

2022-07-08 09:27:48

CSSIFC模型

2023-12-12 08:02:10

2024-08-06 09:47:57

2024-12-02 09:57:43

GormScopesClauses

2024-01-02 12:05:26

Java并發編程

2023-08-01 12:51:18

WebGPT機器學習模型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美在线成人影院 | 久久乐国产精品 | 91视频在线观看 | 亚洲三区视频 | 国产一区免费 | 欧美黄色片 | 久久久久久成人 | 羞羞的视频免费观看 | 国产一区二区三区四区 | 亚洲精品乱码久久久久久9色 | 又爽又黄axxx片免费观看 | www.精品国产 | 在线观看视频一区二区三区 | 欧美日韩精品久久久免费观看 | 免费看大片bbbb欧美 | 亚洲免费一区二区 | 国产精品久久久久久久午夜片 | 成人h动漫精品一区二区器材 | 亚洲精品色 | 91久久精品日日躁夜夜躁国产 | 日韩在线不卡 | 国产精品久久久久永久免费观看 | 日韩精品一区二区三区在线播放 | 91精品久久久久久久久中文字幕 | 91网站在线观看视频 | 狠狠干美女 | 日本黄色一级视频 | 午夜色播 | 午夜成人在线视频 | 亚洲精品一区二区网址 | 日韩和的一区二区 | 精品国产一区二区三区成人影院 | 天天综合日日夜夜 | 精品国产乱码久久久久久88av | 久久久国产一区 | 一级aaaaaa毛片免费同男同女 | 91亚洲精 | 国产精久久久久久久 | 淫片一级国产 | 亚洲精品1区2区3区 91免费看片 | 四虎永久 |