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"