Java JasperReports:报告速度非常慢

Java JasperReports:报告速度非常慢,java,performance,jasper-reports,Java,Performance,Jasper Reports,我们有这段代码来从XML输入生成PDF报告。它非常慢(在Solaris T5220上处理280K行需要2小时;处理70K行需要10分钟) DocumentBuilder docBuilder=docBuilderFactory.newDocumentBuilder(); FileInputStream fileStream=新的FileInputStream(rawXmlFile); ds=docBuilder.parse(文件流); Map params=新的HashMap(); put(JR

我们有这段代码来从XML输入生成PDF报告。它非常慢(在Solaris T5220上处理280K行需要2小时;处理70K行需要10分钟)

DocumentBuilder docBuilder=docBuilderFactory.newDocumentBuilder();
FileInputStream fileStream=新的FileInputStream(rawXmlFile);
ds=docBuilder.parse(文件流);
Map params=新的HashMap();
put(JRXPathQueryExecuterFactory.PARAMETER\uXML\uData\uDocument,ds);
params.put(JRXPathQueryExecuterFactory.XML_DATE_模式,com.vodafone.gdsp.reporting.enums.XML.DateFormat.DATE_FORMAT_ISO8601);
put(JRXPathQueryExecuterFactory.XML_NUMBER_模式,“#####0.##”);
put(JRXPathQueryExecuterFactory.XML_LOCALE,LOCALE.ENGLISH);
params.put(JRParameter.REPORT_LOCALE,LOCALE.UK);
参数put(“REPORT_DIR”,jasperFile.substring(0,jasperFile.lastIndexOf(“/”));
试一试{
virtPageSize=Integer.parseInt(reportConfig.getJasperVirtPageSize());
virtPageDir=reportConfig.getJasperVirtPageDir();
}捕获(NullPointerException npe){
info(“未分配虚拟页面大小和目录,使用默认值virtPageSize{}和virtPageDir{}”,virtPageSize,virtPageDir);
}捕获(例外情况除外){
error(“获取虚拟页面大小和目录{}时出现异常”,例如getMessage());
}
info(“使用Jasper虚拟参数({},{})”,virtPageSize,virtPageDir);
JRFileVirtualizer virtualizer=新的JRFileVirtualizer(virtPageSize,virtPageDir);
JRVirtualizationHelper.setThreadVirtualizer(virtualizer);
params.put(JRParameter.REPORT_VIRTUALIZER,VIRTUALIZER);
DefaultJasperReportsContext上下文=DefaultJasperReportsContext.getInstance();
JRPropertiesUtil.getInstance(context).setProperty(“net.sf.jasperreports.xpath.executer.factory”,
“net.sf.jasperreports.engine.util.xml.jaxexpathexecuterfactory”);
文件jasperReport=新文件(jasperpile);
JasperPrint JasperPrint=JasperFillManager.fillReport(新文件输入流(jaspereport),参数);
正如您所看到的,这确实包括“use-Jaxen”属性,但是在使用Jaxen和不使用Jaxen的情况下,在性能上没有观察到任何差异。因此,要么我们的“使用Jaxen”配置不正确,要么我们有一个不同的问题

还有其他人遇到过这个问题并解决了吗? 有人对如何确定问题有什么建议吗我已经打开了日志记录,但是日志记录不是很详细,除非它涉及到详细的逐行日志记录——没有任何内容说“我已经看到‘usejaxen’指令并且将使用Jaxen”或者类似的任何内容

非常感谢

更新:当我在笔记本电脑(Windows7系统)上运行这个时,280K报告只需16分钟;当我用Xalan而不是Jaxen在我的笔记本电脑上运行同一个报告时,我是在08:00开始的,现在是15:00,它还没有完成;因此,Jaxen库是我所需要的


我不明白的是,为什么在Solaris 10和T5220上运行时完全没有区别。我将深入研究RAM等等——可能是资源限制。如果有人遇到过这个问题,我仍然会很感激任何建议。

我也有同样的问题。一个330ko(2k行)的xml需要9800ms,如果我使用Jaxen,需要41000ms。 所以我想知道当前版本JR5.6.1是否已经解决了这个问题。但是,如果我运行qxmlwtih11114ko(65536行),则需要1.7小时!DOM运行太慢,占用了大量内存。所以我认为可能应该换成另一种解析方法。
SAX:

这里也有同样的问题。您的sql jdbc数据源在哪里。。。。
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
FileInputStream fileStream = new FileInputStream(rawXmlFile);
ds = docBuilder.parse(fileStream);

Map<String, Object> params = new HashMap<String, Object>();
params.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, ds);
params.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, com.vodafone.gdsp.reporting.enums.xml.DateFormat.DATE_FORMAT_ISO8601);
params.put(JRXPathQueryExecuterFactory.XML_NUMBER_PATTERN, "##0.##");
params.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.ENGLISH);
params.put(JRParameter.REPORT_LOCALE, Locale.UK);
params.put("REPORT_DIR", jasperFile.substring(0, jasperFile.lastIndexOf("/")));

try {
    virtPageSize = Integer.parseInt(reportConfig.getJasperVirtPageSize());
    virtPageDir = reportConfig.getJasperVirtPageDir();
} catch (NullPointerException npe) {
    logger.info("Virtual page size and directory not assigned, using the default value of virtPageSize {} and virtPageDir {}", virtPageSize, virtPageDir);
} catch (Exception ex) {
    logger.error("Exception while fetching virtual page size and directory {}", ex.getMessage());
}
logger.info("Using Jasper virtual parameters ({}, {})", virtPageSize, virtPageDir);

JRFileVirtualizer virtualizer = new JRFileVirtualizer(virtPageSize, virtPageDir);
JRVirtualizationHelper.setThreadVirtualizer(virtualizer);
params.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);

DefaultJasperReportsContext context = DefaultJasperReportsContext.getInstance();
JRPropertiesUtil.getInstance(context).setProperty("net.sf.jasperreports.xpath.executer.factory",
    "net.sf.jasperreports.engine.util.xml.JaxenXPathExecuterFactory");

File jasperReport = new File(jasperFile);
JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(jasperReport), params);