Проблема с функцией JAXP XSLT document () - PullRequest
5 голосов
/ 15 июня 2011

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

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

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

Ответы [ 3 ]

2 голосов
/ 25 ноября 2011

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

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

саксонской: отбрасывать-документ ()

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

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

.

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

1 голос
/ 25 ноября 2011

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

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

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

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

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

1 голос
/ 15 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...