2014-06-19 223 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/