我有一个报告,它会选择一个返回我大约900k记录的选项(大约100MB的数据),我需要用它创建一个 PDF 。
所以,我的实现很简单:我从JDBC查询中获取数据,放入ArrayList
并将其传递给我的报告。我有一些内存问题,但我修复了它,我现在的问题是CPU处理(总是100%)使我的进程崩溃。
我的代码很简单:
public OutputStream getOutputStream(OutputStream out) {
try {
JasperPrint print = JasperFillManager.fillReport(jasperName, params, fillList);
JRExporter exporter = format.getExporter();
exporter.setParameter(JRExporterParameter.JASPER_PRINT, print);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
exporter.exportReport();
} catch (Exception e) {
throw new RuntimeException("Error getting the stream", e);
}
return out;
}
我想知道:
答案 0 :(得分:2)
我建议两件事。 1.尝试从JasperReport 本身触发查询,而不是将其存储在Arraylist中,然后将其传递给报告。
2.使用报告虚拟器。根据您的需要,您可以使用Swap Virtualizer或Gzip虚拟器。 Jasper声称Gzip虚拟器将jasper对象压缩为原始jasper对象的1/10。
Virtualizer将确保无论您的数据有多大,报告始终都是使用虚拟器生成的。我亲自使用GZip虚拟器打印了超过25000个超过500MB大小的报告,以确保它确实正常工作。