2014-06-19 225 views
2

我们有这段代码可以从XML输入生成PDF报告。这是非常缓慢的(2小时处理280K行; 10分钟70K行,在Solaris T5220上)。JasperReports:fillReport非常慢

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); 

这并不包括你可以看到“使用Jaxen的”属性 - 但没有与Jaxen的表现观察到的差异,并没有Jaxen的。因此,我们使用的“使用Jaxen”配置不正确,或者我们有不同的问题。

有没有人遇到过这个并解决了它? 有没有人对如何确定问题有任何建议? - 我已经开始记录日志,但日志记录不是非常详细,除非涉及到在逐行级别记录日志 - 没有说“我已经看到'使用Jaxen'指令并将使用Jaxen”或任何沿着这些线。

非常感谢!

更新:当我在我的笔记本电脑(Windows 7系统)上运行此应用程序时,280K报告在16分钟内运行;当我在笔记本电脑上运行与Xalan相同的报告而不是Jaxen时,我在08:00开始使用它,现在是15:00,并且尚未完成;因此Jaxen图书馆是我需要的。

我不明白为什么在Solaris 10上运行T5220时完全没有区别。我将深入研究RAM等 - 可能存在资源约束。如果有人遇到这种情况,我仍然会很感激任何建议。

+0

同样的问题在这里。你在哪里sql jdbc数据源.... – tom

回答

1

我有同样的问题。一个330毫升的xml(2k行),需要9 800毫秒,如果我使用Jaxen,则需要41 000毫秒。 所以我想知道当前的版本JR 5.6.1是否已经是这个问题了。但是如果我用11个114ko(65536行)运行q xml,则需要1.7小时! DOM运行速度太慢并占用大量内存。所以我认为可能应该改为另一种解析方法。 SAX:http://blog.synyx.de/2012/08/big-jasper-reports-with-custom-xml-datasource/