JasperReports - 处理从数据库到PDF的大数据

时间:2013-04-24 14:23:54

标签: java performance io jasper-reports

我有一个报告,它会选择一个返回我大约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;
    }

我想知道:

  • 在这种情况下,我如何使用CPU的多核?
  • 还有其他策略吗?

1 个答案:

答案 0 :(得分:2)

我建议两件事。 1.尝试从JasperReport 本身触发查询,而不是将其存储在Arraylist中,然后将其传递给报告。

2.使用报告虚拟器。根据您的需要,您可以使用Swap Virtualizer或Gzip虚拟器。 Jasper声称Gzip虚拟器将jasper对象压缩为原始jasper对象的1/10。

Virtualizer将确保无论您的数据有多大,报告始终都是使用虚拟器生成的。我亲自使用GZip虚拟器打印了超过25000个超过500MB大小的报告,以确保它确实正常工作。