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

标签 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. 尝试从 JasperReport 本身触发查询,而不是将其存储在 Arraylist 中,然后将其传递给报表。

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

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

关于java - JasperReports - 处理从数据库到 PDF 的大数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16194556/

相关文章:

java - 大目录处理缓慢

java - 为什么 getCanonicalPath 会抛出已检查的异常而 getAbsolutePath 不会?

java - 将每个属性的单个 bean rowise 写入 csv

java - React Native ReactContext 生命周期停留在 BEFORE_CREATE

JAVA Swing GridLayout 无法正常工作

java - Java 和 .NET 字符串文字驻留在哪里?

c++ - Julia 表演建议

performance - 为什么 hudson "mvn clean install"构建的时间比命令行上的构建时间长 3-6 倍?

r - 从决策树进行预测的高效算法(使用 R)

linux - BASH:从两个输入流读取的最佳架构