Java JasperReports-处理从数据库到PDF的大数据
我有一个报告,需要一个select,它返回我大约900k条记录(大约100MB的数据),我需要用它创建一个PDF 因此,我的实现很简单:我从JDBC查询中获取数据,放入Java JasperReports-处理从数据库到PDF的大数据,java,performance,io,jasper-reports,Java,Performance,Io,Jasper Reports,我有一个报告,需要一个select,它返回我大约900k条记录(大约100MB的数据),我需要用它创建一个PDF 因此,我的实现很简单:我从JDBC查询中获取数据,放入ArrayList并将其传递给我的报告。我在内存方面有一些问题,但我已经解决了,我现在的问题是CPU处理(总是100%)导致我的进程崩溃 我的代码非常简单: public OutputStream getOutputStream(OutputStream out) { try { Jasp
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中,然后将其传递给report
2.使用报告虚拟机。根据需要,您可以使用交换虚拟机或Gzip虚拟机。Jasper声称Gzip虚拟机将Jasper对象压缩到原始Jasper对象的十分之一
无论您的数据有多大,Virtualizer都将确保始终使用Virtualizer生成报告。我个人使用GZip虚拟机打印了超过25000份超过500MB大小的报告,以确保它确实正常工作。当你说你的CPU总是在100%时,你是说所有的核心都在100%吗?就一个?你说的撞车是什么意思?你有什么堆栈跟踪之类的吗。如果是这样的话,将其包括在内可能是有用的。