JasperReports fillReport太慢且耗费资源
我发现从Java应用程序填充报告时,JasperReports真的很慢 。 该程序挂起在这一行:
print = JasperFillManager.fillReport(report, parameters, xmlDataSource);
它通常在那里停留3分钟,消耗高达300Mb的RAM和50%的CPU 。
-
report
是一个使用3个子report
已编译(.jasper)报表。 - 数据源是一个非常大的XML文件(大约100k行,1.5Mb)
- 该机器是3Ghz双核,带有4Gb RAM
那么,我该如何提高报告填充性能呢?
问题
似乎问题是XPath引擎。 也就是说,解析XML文件寻找数据的库。
虽然iReport Designer使用Jaxen ,但JasperReport使用Xalan 。 与Jaxen相比,Xalan真的很慢(真的很慢)。
这就是为什么只在从Java应用程序而不是从iReports填充报表时才会出现问题。
解决方案
好吧,解决方案很简单, 只需在Java应用程序中添加以下行来选择Jaxen lib而不是默认的Xalan lib(它已被弃用,但它可以工作):
JRProperties.setProperty("net.sf.jasperreports.xpath.executer.factory", "net.sf.jasperreports.engine.util.xml.JaxenXPathExecuterFactory");
编辑 :该行已被弃用,我找到了设置属性的正确方法:
DefaultJasperReportsContext context = DefaultJasperReportsContext.getInstance(); JRPropertiesUtil.getInstance(context).setProperty("net.sf.jasperreports.xpath.executer.factory", "net.sf.jasperreports.engine.util.xml.JaxenXPathExecuterFactory");
您还需要将Jaxen .jar添加到构建路径中。 这是一个链接: https : //mvnrepository.com/artifact/jaxen/jaxen
虽然使用Xalan填写报告需要3-5分钟,但现在只需几秒钟即可完成Jaxen。
答案在这里找到: http : //community.jaspersoft.com/questions/536842/jasperreports-too-slow
还有这里: http : //community.jaspersoft.com/wiki/xml-data-source-very-slow-parse
当我导出pdf时,我也遇到了这个问题,但在我的情况下,它似乎是一个无限循环,因为当我试图生成JasperReport时,CPU达到了100%。
经过大量的研究,我发现了这个链接:
http://community.jaspersoft.com/questions/527078/infinite-loop-subreport-fill
设置我的子isPrintWhenDetailOverflows="false"
时解决了我的问题isPrintWhenDetailOverflows="false"
。
- JasperReports:如何在jsp页面中调用报告
- 如何将任意对象作为参数传递给jasper报告?
- 是什么让Jasper Reports抛出java.io.IOException读取字体数据?
- struts2 + hibernate3 + jasper-report 5.0 —得到空白报告
- 无法通过JRXmlLoader加载位于jar文件中的jrxml:获取java.io.FileNotFoundException
- JasperReports:无法找到子报告
- 如何使用jasper以pdf格式从jsp生成报告
- 如何在Table组件的帮助下显示JRBeanCollectionDataSource数据?
- 如何在jasper报告中显示图像