最近客户反应开发的一个采购管理系统在上传大的文件时会出现宕机卡死的问题,尤其是在进行多文件批量上传、超大文件(几百MB或上GB)上传时极其容易发生。日志信息显示,引发的异常为致命异常 java.lang.OutOfMemoryError Java heap space 。

通过查看其文件上传的相关源代码发现类似如下代码内容:
byte[] fileData = formFile.getFileData();   //获取上传文件的字节数据
if (fileData != null && fileData.length > 0) {FileOutputStream fos = new FileOutputStream(destFilePath);BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);bos.write(fileData);bos.flush();bos.close();
}
其中的变量formFile是Struts1中表示通过前台表单上传的文件类org.apache.struts.upload.FormFile的一个实例。其getFileData()方法返回的就是文件内容的字节数组。
按照朋友的代码写法,即是一次性获取上传文件中的字节数据并写入保存到指定的输出流中。当上传的文件非常大时,该字节数组也巨大无比, Java虚拟机没有足够的内存来为该字节数组分配空间,从而引发该致命异常。
将上述部分代码进行如下改写:
InputStream inputStream = formFile.getInputStream();
FileOutputStream fos = new FileOutputStream(destFilePath);
BufferedOutputStream bos = new BufferedOutputStream(fos, 1024);
int length = 0;
byte[] buffer = new byte[1024];
while ((length = inputStream.read(buffer)) != -1) {bos.write(buffer, 0, length);
}
bos.flush();
bos.close();
inputStream.close();
如上改写后,经过多次上传几GB的超大文件测试以及正式上线运行后的日志反馈,不再引发宕机问题。
在这里,我们可以把一个超大文件看作一个水池,需要将其中的水传输到其他地方。第一种写法就是直接将水池中所有的水存放在服务器上,再通过服务器传输到其他地方,而服务器根本无法一次性负载这么多的水,于是服务器就被「淹死」了。而第二种写法,就是通过服务器在大水池和目的地之间架设一条大小适宜的水管,通过水管将水池中的水不断地传输到目的地。这样服务器完全能够承受任何「一刻」所负载的水量,自然就不会出现被「撑死」的问题。
在我们生活中也有许多类似的道理,饭不是直接端着锅就往嘴巴里倒,而是用碗盛起一小部分,然后一口一口地吃。饭吃得太急会噎死,水喝得太急会呛死。在服务器上这个道理也同样适用。无论是Java、 C#还是其他 编程语言,文件流都能起到如上类似的作用。而其他类似的大数据处理问题,也可以采用这样的思路来解决。

如何解决上传大文件时(批量上传文件)系统卡死宕机的问题相关推荐

  1. ftp服务器批量上传文件,bat批量上传ftp文件到服务器

    bat批量上传ftp文件到服务器 内容精选 换一换 CDM支持周期性自动将新增文件上传到OBS,不需要写代码,也不需要用户频繁手动上传即可使用OBS的海量存储能力进行文件备份.这里以CDM周期性备份F ...

  2. 解决ServletFileUpload上传文件时,获取上传文件名出现中文乱码问题

    解决ServletFileUpload上传文件时,获取上传文件名出现中文乱码问题 在我们使用ServletFileUpload上传文件时,我们通常会获取其上传的文件名,然而当文件名包含中文时,便可能出 ...

  3. WEB版一次选择多个文件进行批量上传(Plupload)的解决方案

    说明:Plupload支持多种浏览器,多种上传方式! 一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的添加到页面,无法如 w ...

  4. vue+elementui 同时有上传文件和批量上传文件功能,上传文件或批量上传文件后必须刷新才能再次上传文件

    报错描述: 使用element-ui的上传文件组件写一个批量上传和上传文件,但是发现每次上传文件后或者批量上传文件后,不能再次上传文件或者批量上传文件.只有进入页面第一次点击上传文件或者批量上传文件才 ...

  5. antd design Upload文件上传,删除,批量上传组件封装

    1.单个文件上传组件,无文件时显示上传,有文件时显示文件,可删除,重新上传,样式适合图片上传,可根据文件格式更改样式,效果图如下. 页面调用代码 <FormItem{...formItemLay ...

  6. step-by-step多文件WEB批量上传(swfupload)的完美解决方案

    来源:http://www.cnblogs.com/goody9807/archive/2008/11/04/1326098.html 功能完全支持ie和firefox浏览器! 一般的WEB方式文件上 ...

  7. html限制视频上传大小,微信公众号怎么上传大视频?可以上传多大的视频?

    原标题:微信公众号怎么上传大视频?可以上传多大的视频? 想在公众号文章中插入视频,但不知道公众号可以传多大的视频,这篇文章会给你答案,继续看下去吧~ 微信公众号视频大小限制多少 当写公众号文章时,我们 ...

  8. SPSS Modeler导入excel文件时出现“无法读取文件列名”解决方法

    SPSS Modeler导入excel文件时出现"无法读取文件列名"解决方法 经过本人多次尝试,终于发现了原因 原因是:excel文件在后台打开了,因此spss modeler读取 ...

  9. CAD控件教程:网上打开dwg文件时,对dwg文件路径加密的功能

    软件名称: 看楼主头像... 1.增加控件状态栏文字,自定义功能, C++接口为 :   CStatusBarInformationReactor::CreateProgressBarText COM ...

最新文章

  1. python爬虫入门代码-Python爬虫入门(一) 网络爬虫之规则
  2. 基于用户投票的排名算法(一):Delicious和Hacker
  3. 再谈java乱码:GBK和UTF-8互转尾部乱码问题分析
  4. 使用CMD命令删除文件函数
  5. NPAPI中返回一个字串的正确做法
  6. Windows编程之钩子程序
  7. hustoj 配置java_HUSTOJ增加其他语言出现RuntimeError解决办法
  8. jqueryUI对应jquery版本
  9. 【51单片机实例教程】智能小车(一)让你的小车跑起来
  10. HTMl悬浮播放器XPlayer,Xplayer播放器
  11. java魔法门1_魔法门之英雄无敌5
  12. 流量都去哪儿了? 流量不清零后“消耗快”
  13. MS Materials Studio 安装
  14. 阿里云聆听平台使用有感
  15. chroom浏览器网页二维码生成功能的方法
  16. 几种优化算法(求最优解)
  17. OpenCV图像阈值
  18. 中国汽车流通协会:2018年7月二手车市场分析
  19. Java专题 Map,hashMap 多种遍历方式 总结+统计字符出现次数案例
  20. python核心编程笔记

热门文章

  1. 二十四、动网格Remeshing方法及实例
  2. DAVINCI DM365-DM368开发攻略——开发环境搭建(DVSDK4.02)
  3. mysql generatedkey_Mybatis使用generatedKey在插入数据时返回自增id始终为1,自增id实际返回到原对象当中的问题排查...
  4. linux系统中程序调试指令(gdb)
  5. 数据结构C语言版(李云清)实验6 树
  6. php latin1 转utf8,PHP-将UTF8转换为latin1_swedish_ci
  7. OLTP 与 OLAP
  8. 算符优先分析法实现给定表达式的分析识别(Python)
  9. you can run: npm install --save core-js
  10. 常见校园网失效问题解决