JAVA POI内存不足问题

时间:2015-03-10 06:38:44

标签: java jvm apache-poi

我想用500000条记录创建excel(xlsx)报告,而不是10个cols.With jboss 512M和apache poi(3.9)。

由于poi usermodel存在内存问题,因此预期JVM因内存不足错误而崩溃。

所以我尝试使用SXSSFWorkbook提供临时目录以将行刷新到磁盘。生成的报告没有任何问题。

  1. 我正在生成Web应用程序的报告,其中我正在将workbbok写入servlet OP流。如果多个用户尝试同时获取报告,这会导致任何问题,因为临时目录由多个线程共享。

  2. 我还调用了SXSSFWorkbook的dispose方法来清理临时文件,它是否安全,因为我怀疑它不应该删除其他线程创建的临时文件(其他用户请求)

  3. 同样以下代码是安全的吗?因为我在关闭输出流之前处理但是在将工作簿写入输出流之后。

    workbook.write(out);
    workbook.dispose();     
    out.flush();
    out.close(); 
    

2 个答案:

答案 0 :(得分:0)

  1. 使用File.createTempFile()
  2. 使用File.deleteOnExit()加上
  3. try { /*...*/ } finally { file.delete() }

    块。

    1. 认为这是安全的。

答案 1 :(得分:0)

它应该是安全的,因为POI在内部使用File.createTempFile() - 代码位于org.apache.poi.util.TempFile.createTempFile(String, String)。但是,如果您运行多个Web应用程序(具有单独的JVM),除非您设置了属性poi.keep.tmp.files,否则可能会遇到麻烦 - POI在临时目录中的poifiles子目录中创建其临时文件,并尝试在退出时删除它。如果其他带有POI的JVM仍在运行,这将导致问题。