日期:2014-05-20  浏览次数:20777 次

java上传excel30000条数据内存泄露
java上传excel3万条数据内存泄露.

 数组都装不下,怎么办..

 试过修改tomcat下内存设置,,没用..
谁有什么好思路

------解决方案--------------------
分批次提交,我记得好像一个batch提交数量是有限制的,大概也就在2~3万左右。
------解决方案--------------------
把一个excel分多个sheet,分sheet读取内容到内存,这样就不会内存溢出
------解决方案--------------------
我先把 excel放在 数组里.. 数组装不下
在文件流中分配读入到内存,在用batch提交,不要一下读入内存,这样肯定memory out.
------解决方案--------------------
使用CachedRowSet可以解决
------解决方案--------------------
数组内放一点 提交一点,如果没有序列,可以考虑线程
不要一次性提交太多
比如可以几千一个批次
另外batch限制是65535好像,不过如果是excel03版以前 单表行数也是65535,太多了要分表
------解决方案--------------------

------解决方案--------------------
要不这样吧:

分成十个文件,打个zip包后上传到服务器端某个目录。服务端先做个解zip包的操作,然后循环读取各个文件。
------解决方案--------------------
现实中这么大的Excel,谁会用呢???
------解决方案--------------------
不用jxl,用OutputStreamWriter来一点一点输出
------解决方案--------------------
再狠点。。。。JDBC读,不过问题会不少
------解决方案--------------------

那是肯定溢出的,jxl是将数据读取到内存了,

解决方法有两种:
第一可以设置jvm的虚拟内存。这个简单方便,但不是长久之计;
第二可以进行分批处理,我看你是先读取了excel而文件中数据又很多,这个时候要分
几个sheet工作表。

探讨
我刚断点了

InputStream is = new FileInputStream(fileName);
jxl.Workbook rwb = Workbook.getWorkbook(is); 这就溢出了

------解决方案--------------------
上传到数据库
我经常从excel导入数据到oracle
不过不用java,直接使用sqlldr
------解决方案--------------------
一般情况下,excel文档不会超过10M吧,溢出可能是你代码里有无限循环了,再仔细审查一下代码吧
------解决方案--------------------
这么悲催。。。我上传下载。。读写一个65536条数据的excel一点问题没有。。

Workbook.getWorkbook(is); 这句溢出。
可能原因:
1. 每行数据量比较大。。。
2. jvm分配内存小了。。。
3. 调大tomcat内存参数。。