zoukankan      html  css  js  c++  java
  • 催收案件发布Excel文件上传并解析接口并发100出现内存溢出案例

    POST /debtorder/debt/uploadExcel

    30个并发压测就会出现5302服务宕机

     

    问题主要是出现在excel文件解析上,即使excel文件中只有一条记录,也会出现OOM

    由于采用的是POI解析文件,EXCEL解析的时候内存占用太大,容易导致内存溢出,所以优化后,采用阿里的easyexcel

    POI百万级大数据量EXCEL导出 采用了分批查询数据来避免内存溢出和使用SXSSFWorkbook方式缓存数据到文件上以解决下载大文件EXCEL卡死页面的问题。

    不过一是存在封装不太友好使用不方便的问题,二是这些poi的操作方式仍然存在内存占用过大的问题,三是存在空循环和整除的时候数据有缺陷的问题,以及存在内存溢出的隐患。

    阿里开源的EasyExcel框架,可以将解析的EXCEL的内存占用控制在KB级别,并且绝对不会内存溢出(内部实现待研究),还有就是速度极快, 大概100W条记录,十几个字段, 只需要70秒即可完成下载

    Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,

    但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到KB级别,

    并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便

    优化后:

    但是还是无法支撑高并发,目前30个并发就不会报错,但是40并发就会出错

    但是老年代还是频繁的回收GC,同时接口的耗时也比较严重,上述测试的案例,是一个excel中有50条记录

    问题解决以后:

    50条记录的excel在50并发下上传,响应时间基本控制在1s以内

    主要优化点:

    这个sql优化

    ALTER  TABLE  `t_organization_auth`  ADD  INDEX idx_orgId ( `orgId` )

    优化2:将poi解析框架替换成easyexcel矿建

    优化3:复杂4表联合优化成单标查询

    优化4:增加jvm内存到从2g到3g和6g

    50并发条件

    作者:Agoly
    出处:https://www.cnblogs.com/qmfsun/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    如果文中有什么错误,欢迎指出。以免更多的人被误导。
  • 相关阅读:
    C# 使用NPOI 实现Excel的简单导入导出
    C# 根据Excel模版导出文件
    移动通信第九组网络抓包作业
    武金龙老师的教导(第9小组)
    【Python核心编程笔记】一、Python中一切皆对象
    自己喜欢的几个前端框架
    2018-1-6-个人博客、博客园、微信公众号、Github、本地同步写博客
    2018-1-6-IDEA快速代码生成
    CodeMirror动态修改代码(关键: editor.getDoc().setValue(data); editor.refresh();)
    FaceId枚举表(用于VBA的加载项)
  • 原文地址:https://www.cnblogs.com/qmfsun/p/11352539.html
Copyright © 2011-2022 走看看