我从Java应用程序填写报告时发现JasperReports真的慢。程序挂起在这一行:
print = JasperFillManager.fillReport(report, parameters, xmlDataSource);
它通常会在那里停留 3分钟,消耗高达300Mb的RAM和50%的CPU 。
report
是一个使用3个子报告的已编译(.jasper)报告。那么,如何提高报告填写绩效呢?
答案 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"
。