正确使用JRSwapFileVirtualizer?

时间:2012-08-01 17:38:07

标签: java jasper-reports export

我正在导出一份非常庞大的碧玉报告(约20000页)。出于这个目的,为了避免内存不足错误,正如不同网站所建议的那样,我正在使用JRSwapFileVirtualize,如下所示:

virtualizer = new JRSwapFileVirtualizer(1000, new JRSwapFile(reportFilePath, 2048, 1024), true);
parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
.
.
JasperPrint print = JasperFillManager.fillReport(report, parameters, list);
virtualizer.cleanup();

我的问题是:

1)我已将maxSize配置为1000. 20000页的报告可以吗?

2)我在方法调用'fillReport'后立即清理虚拟器。我将报告导出到XLS后是否正确或需要清理虚拟器?

3)导出报告后是否正在清理虚拟器,对我有帮助吗?

4)创建JasperPrint对象,逻辑写在服务器端。导出报告逻辑,是用java客户端编写的。如果我应该清理虚拟器,导出报告后,如何处理这种情况?因为在这种情况下我需要在服务器端创建静态对象(因为我无法在服务器和客户端之间创建并传递它的JRSwapFileVirtualizer),然后再次导出后我需要调用服务器端方法来清理虚拟器。我在想创建静态对象是一种风险,因为如果对服务器端逻辑进行多次调用,那么virtualizer静态对象将保持对最新调用创建的交换文件的引用,因此在清理之后,以前的交换文件可能不会被删除

我找到了有关此主题的更多信息: 在jasper提供的使用虚拟器的示例中,只有在调用common export时才会清理虚拟器,这会导出多种类型的文件。当他们只导出单一类型的报告时,他们没有打电话给清理:

else if (TASK_CSV.equals(taskName))
{
    exportCSV(jasperPrint);
}       
else if (TASK_EXPORT.equals(taskName))
{
    exportPDF(jasperPrint);
    exportXML(jasperPrint, false);
    exportHTML(jasperPrint);
    exportCSV(jasperPrint);

    // manually cleaning up
    virtualizer.cleanup();
}

此示例中他们还没有提到XLS导出。我找到了另一个人面临同样问题的链接,但也没有提到解决方案:

http://www.jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=95689

此链接也表示我们可以使用JRXlsxExporter。但JRXlsxExporter仅在2003年出口excel 2007格式。

我正在使用JExcelApiExporter.exportReport()将报告导出到XLS,对于大型报告,它无法正常工作。 请帮我解决这个问题。 任何小的暗示或建议都是可观的。如果您需要更多信息,请与我们联系。 感谢。

2 个答案:

答案 0 :(得分:1)

1.对于你的第一个问题,  这实际上取决于您为报告生成应用程序提供的堆大小。尝试试错场景&你会得到确切的大小

第二个问题

2.按照你的第一个代码片段, 您正在填写报告并立即在虚拟器上应用清理。所以即使你已经创建了报告,在清理之后你的交换文件也会被销毁。既然你的数据。 - 确认完成报告数据使用后,应在虚拟器上应用清理。所以在这种情况下导出为特定格式。

3.cleanup是立即销毁交换文件。 因此,如果您在导出应用清理后不打算重复使用该报告,那么最好。 注意:即使你没有明确地清理它,垃圾收集器也会在处理jasperPrint时销毁它。

你的第四点我不太清楚,你是说jasperPrint一直在服务器端创建....导出逻辑已写在客户端...如何在客户端出口逻辑而不参考JasperPrint,这是服务器端.... ?? 1 !!

答案 1 :(得分:1)

好的..当您应用fillReport时,您的所有数据集(记录)将保存在jvm(堆空间)中,导出器在导出为任何格式时将使用它。

如果您的数据集大小比jvm的大小增加,您将被outOfMemeryError挂起,因此虚拟化器(FileVirtualizer& swapfile)将帮助您将这些数据集存储到文件中,而不是使用jvm内存(最终使用它)用于将数据集存储到文件的序列化。)

关于文章:在填写报告时使用它是正确的:因此填充(调用fillReport)时,需要在内存中存储一​​些需要即时访问的对象&使用虚拟器保留文件。因此,当您尝试访问剩余记录时(使用导出程序选项进行分页),JasperPrint将从文件中获取这些记录,并根据需要交换未使用的页面。

在这里,我只讨论JRFileVirtualizer JRSwapFileVirtualizer。 对于JRGzipVirtualizer,存储将是内存但压缩格式。如果您没有直接访问磁盘,将使用哪个。