13.02.2013

XML Publisher: кое-что о больших отчетах

Почему стоит отказаться от гигантских отчетов.
В моей практике была необходимость построить отчет, содержащий около 20 вкладок по почти 200 колонок на каждой. На каждой вкладке предполагалось две секции, содержащие 3-х ступенчатую иерархию с агрегатами на каждой из ступеней. C dataDefinition и xsl-шаблоном разобраться удалось: это были гигантские конструкции по сотне тысяч сток. На 15-й минуте полета этот Шаттл Дискавери взрывался:
****Warning!!! Due to high volume of data,

    got out of memory exception...
    ******************************
    Please retry with scalable option or modify
    the Data template to run in scalable mode...
Виртуальной машине Java (JVM), а точнее канкарент-процессу XDODTEXE не хватает памяти, чтобы сформировать отчет. "Это устранимо" - подумав, подумал я и задал параметры канкарента:
    -Xss2048k -Xmx2048m
Первый задает размер стека для JVM 2МБ. Второй задает размер максимальный размер виртуальной памяти ("heap size") 2ГБ.
Ура! С такими параметрами Шаттл летит уже почти час. Журнал показывает, что все запросы отработали и идет постпроцессинг, т.е. натягивание XML на разметку из XSL-шаблона (как выяснилось позже, размер XML составляет ~32МБ). Ждем..
Вываливается с предупреждением.
Ошибка заключительной обработки запроса 
17680513: 12-ФЕВ-2013 14:49:43. Сообщение об ошибке:
Время ожидания диспетчером запросов завершения 
заключительной обработки результатов для данного запроса истекло
Oracle Post Process
Смотрим в логи службы Oracle Post Process (OPP):
[2/12/13 2:49:43 PM] [UNEXPECTED] [620456:RT17680513] java.lang.reflect.InvocationTargetException
        at sun.reflect.GeneratedMethodAccessor34.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at oracle.apps.xdo.common.xml.XSLT10gR1.invokeProcessXSL(XSLT10gR1.java:677)
        at oracle.apps.xdo.common.xml.XSLT10gR1.transform(XSLT10gR1.java:425)
        at oracle.apps.xdo.common.xml.XSLT10gR1.transform(XSLT10gR1.java:244)
        at oracle.apps.xdo.common.xml.XSLTWrapper.transform(XSLTWrapper.java:182)
        at oracle.apps.xdo.oa.schema.server.TemplateHelper.runProcessTemplate(TemplateHelper.java:6032)
        at oracle.apps.xdo.oa.schema.server.TemplateHelper.processTemplate(TemplateHelper.java:3459)
        at oracle.apps.xdo.oa.schema.server.TemplateHelper.processTemplate(TemplateHelper.java:3548)
        at oracle.apps.fnd.cp.opp.XMLPublisherProcessor.process(XMLPublisherProcessor.java:302)
        at oracle.apps.fnd.cp.opp.OPPRequestThread.run(OPPRequestThread.java:176)
Caused by: java.lang.ThreadDeath
        at java.lang.Thread.stop(Thread.java:758)
        at oracle.apps.fnd.cp.opp.OPPRequestThreadManager.terminateThread(OPPRequestThreadManager.java:210)
        at oracle.apps.fnd.cp.opp.OPPTerminateCommand.execute(OPPTerminateCommand.java:48)
        at oracle.apps.fnd.cp.opp.OPPServiceThread.processMessage(OPPServiceThread.java:243)
        at oracle.apps.fnd.cp.opp.OPPServiceThread.waitForMessages(OPPServiceThread.java:230)
        at oracle.apps.fnd.cp.opp.OPPServiceThread.mainLoop(OPPServiceThread.java:131)
        at oracle.apps.fnd.cp.gsf.BaseServiceThread.run(BaseServiceThread.java:136)
Получили Thread Death. Постпроцессинг не справился с таким объемом данных.

Экспериментирование с количеством вкладок (включение/выключение простым условием XSLT) показало: с 3 вкладками отрабатывает, с 7 падает. Сложно сделать выводы о вероятности падения, даже располагая объемом данных, потому как нет достоверных сведений о том, что происходит внутри обработчика постпроцессинга и сколько потребуется ресурсов. Можно долго экспериментировать, но в любом случае работоспособность подобного отчета на продуктиве не будет гарантирована. Итак, сформулируем общее (да, очень размытое, но другого не дано) правило: при формировании отчетов, объем данных которых больше, чем несколько мегабайт, имеет смысл сократить количество вкладок/разделов/абзацев до минимального. То есть: формируем не за много месяцев, а за один; товары не всех категорий, а одной; по магазинам не нескольким, а одному.

Комментариев нет :