У меня есть система, которая выполняет много XSL-преобразований для объектов XMLType. Проблема заключается в том, что система постепенно замедляется со временем и иногда падает, когда ей не хватает памяти. Похоже, что замедление (и, возможно, сбой памяти) происходит вокруг вызова функции dbms_xslprocessor.processXSL
, который постепенно занимает все больше и больше времени.
Код выглядит так:
v_doc dbms_xmldom.DOMDocument;
v_transformer dbms_xmldom.DOMDocument;
v_XSLprocessor dbms_xslprocessor.Processor;
v_stylesheet dbms_xslprocessor.Stylesheet;
v_clob clob;
...
transformer := PKG_STUFF.getXSL();
v_transformer := dbms_xmldom.newDOMDocument(transformer);
v_XSLprocessor := Dbms_Xslprocessor.newProcessor;
v_stylesheet := dbms_xslprocessor.newStylesheet(v_transformer, '');
...
for source_data in (select id in source_tbl) loop
begin
v_doc := PKG_CONVERT.convert(in_id => source_data.id);
--start time of operation
v_begin_op_time := dbms_utility.get_time;
--reset the CLOB
v_clob := ' ';
--Apply XSL Transform
dbms_xslprocessor.processXSL(p => v_XSLprocessor, ss => v_stylesheet, xmldoc => v_Doc, cl => v_clob);
v_doc := dbms_xmldom.newDOMDocument(XMLType(v_clob));
--end time
v_end_op_time := dbms_utility.get_time;
--calculate duration
v_time_taken := (((v_end_op_time - v_begin_op_time)));
--log the duration
PKG_LOG.log_message('Time taken to transform XML: '||v_time_taken);
...
...
DBMS_XMLDOM.freeDocument(v_Doc);
DBMS_LOB.freetemporary(lob_loc => v_clob);
end loop;
Время, затрачиваемое на преобразование XML, медленно сокращается (я полагаю, это также может быть вызов dbms_xmldom.newDOMDocument, но я подумал, что это довольно просто). Понятия не имею почему ....: (
(Oracle 10g)
UPDATE:
Дальнейшее тестирование, просто закомментировав вызов processXSL
, кажется, значительно ускоряет процесс. Все еще жду большего теста набора данных, чтобы подтвердить это, но кажется, что processXSL
- это то, что действительно затягивает. У кого-нибудь еще были проблемы с этим раньше?
Сейчас мы не трансформируем многие XML-документы, только несколько тысяч. XSL не совсем прост, но я только создаю один Processor
, один Transformer
и один Stylesheet
, а затем снова и снова использую их ...
ОБНОВЛЕНИЕ 2:
Даже без преобразований использование памяти продолжает расти. Не достаточно плохо, чтобы разбиться, но все равно не стоит этого делать. Очень загадочно.
ОБНОВЛЕНИЕ 3:
Итак ... наш администратор БД нашел где-то ссылки на тот факт, что было известных утечек памяти в dbms_xmldom
и, возможно, в dbms_xslprocessor
. Проблемы были исправлены в более новых версиях Oracle, но у нас нет этих версий, и, поскольку нет немедленного плана обновления, мы должны обойти это.