18

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

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

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

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

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

4

2 回答 2

22

问题

似乎问题出在 XPath 引擎上。即解析 XML 文件以查找数据的库。

iReport Designer 使用Jaxen,JasperReport 使用Xalan。与 Jaxen 相比,Xalan 真的很慢(真的很慢)。

这就是为什么仅在从 Java 应用程序而不是从 iReports 填充报告时才会出现问题的原因。

解决方案

好吧,解决方案很简单,只需在您的 Java 应用程序中添加以下行以选择 Jaxen 库而不是默认的 Xalan 库(它已被弃用,但它可以工作):

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 -解析

于 2013-04-08T09:04:01.033 回答
4

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

经过大量研究,我找到了这个链接:

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

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

于 2015-10-22T19:17:32.030 回答