我发现,填充的JasperReports从Java应用程序的报告时,实在是太慢了。 该程序挂起,在这一行:
print = JasperFillManager.fillReport(report, parameters, xmlDataSource);
它通常在那里停留3分钟,消耗最多的RAM和50%的CPU 300MB。
-
report
是使用3子报表编译(开发文件)的报告。 - 数据源是一个相当大的XML文件(100K左右线,有1.5Mb)
- 该机是一款3GHz的双核4GB内存
所以,我怎样才能提高报告的填充性能?
问题
看来这个问题是XPath引擎。 也就是说,解析寻找数据的XML文件库。
虽然iReport的设计师使用Jaxen的 ,JasperReport的使用Xalan的 。 Xalan的实在是太慢了比较Jaxen的(真的很慢)。
这就是为什么问题源于iReports从Java应用程序填充的报告,而不是当只发生。
解决方案
好了,解决方法很简单, 只需添加下面一行在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
虽然报告填充正在采取3-5分钟的Xalan,现在完成在短短的几秒钟Jaxen的。
答案在这里找到: http://community.jaspersoft.com/questions/536842/jasperreports-too-slow
和这里: http://community.jaspersoft.com/wiki/xml-data-source-very-slow-parse
我也有这个问题,当我出口PDF,但对我来说这似乎是一个无限循环,因为CPU被击中100%,当我试图生成JasperReport的。
大量的研究后,我发现这个链接:
http://community.jaspersoft.com/questions/527078/infinite-loop-subreport-fill
这问题已经解决。我的设置子报表isPrintWhenDetailOverflows="false"
。