JasperReports fill报告太慢和资源消耗

2022-09-02 13:00:20

我发现JasperReports在从Java应用程序填充报告时真的很。程序在此行挂起:

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

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

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

那么,如何提高报表填充性能呢?


答案 1

问题

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


答案 2

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

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

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

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


推荐