Проблема с функцией JAXP XSLT document()

Я работаю над java-приложением, которое использует преобразование XSLT. У меня есть много вызовов document(), поэтому возможно исключение java.lang.OutOfMemory (которое у меня действительно есть), потому что после каждого вызова функции document() документ кэшируется.

На http://xml.apache.org/xalan-j/faq.html#faq-N102F9 Я читал, что можно увеличить размер динамической памяти, что не является решением в моем случае. Я также пытался использовать инкрементное преобразование, которое, похоже, не поддерживается.

Итак, есть ли возможность отключить кеширование документов в jaxp при работе с функцией document()?


person deephace    schedule 15.06.2011    source источник


Ответы (3)


Как и ответ пользователя 1066037, надеюсь, вы сможете переключиться на Saxon. Saxon имеет расширение под названием saxon:discard-document. Он доступен в версиях PE, EE или Saxon-B. Найдите «Saxon-B» здесь: http://saxon.sourceforge.net/

Из саксонской документации:

saxon:discard-document()

saxon:discard-document($doc as document-node()) ==> document-node()

Эта функция удаляет документ из внутреннего пула документов Saxon. Документ пока остается в памяти, но будет удален из памяти сборщиком мусора Java, когда все ссылки на узлы в дереве документов перестанут быть доступными. Преимущество этого заключается в освобождении памяти, но недостатком является то, что если тот же документ будет загружен снова во время того же преобразования, он будет повторно проанализирован из исходного текста, и будут выделены другие идентификаторы узлов. Функция возвращает узел документа, который был предоставлен в качестве аргумента, что позволяет использовать его в вызове, таком как select="saxon:discard-document(document('a.xml'))".

Если вам нужен пример использования saxon:discard-document, дайте мне знать, и я опубликую его.

person Daniel Haley    schedule 25.11.2011

Предоставленная вами ссылка содержит пример использования пользовательской инструкции по обработке для отключения кэширования. Вы пробовали обходной путь, предложенный там?

person massfords    schedule 15.06.2011

Если у вас есть выбор.

Просто поменяйте Xalan на Saxon, и все станет намного быстрее, и вы сможете значительно сократить потребление памяти.

Насколько я знаю, Xalan будет загружать документ в память, если только что-то не было изменено в последней версии.

У Saxon есть режим потоковой передачи: http://www.saxonica.com/documentation/sourcedocs/streaming/streaming-templates.xml

Надеюсь, это поможет.

person Ivan.Latysh    schedule 25.11.2011