JasperReports fillReport太慢且耗费资源

时间:2013-04-08 09:04:01

标签: java xml performance jasper-reports

我从Java应用程序填写报告时发现JasperReports真的。程序挂起在这一行:

print = JasperFillManager.fillReport(report, parameters, xmlDataSource);

它通常会在那里停留 3分钟,消耗高达300Mb的RAM和50%的CPU

  • report是一个使用3个子报告的已编译(.jasper)报告。
  • 数据源是一个非常大的XML文件(大约100k行,1.5Mb)
  • 该机器是3Ghz双核,带有4Gb RAM

那么,如何提高报告填写绩效呢?

2 个答案:

答案 0 :(得分:15)

问题

似乎问题是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

答案 1 :(得分:4)

当我导出pdf时,我也遇到了这个问题,但在我的情况下,它似乎是一个无限循环,因为当我尝试生成JasperReport时,CPU达到了100%。

经过大量研究后,我发现了这个链接:

http://community.jaspersoft.com/questions/527078/infinite-loop-subreport-fill

我的问题已解决,设置了我的子报告isPrintWhenDetailOverflows="false"