我有一个报告,它接受一个选择,返回大约 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/