我有一個系統正在對XMLType對象執行許多XSL轉換。問題在於隨着時間的推移,系統逐漸變慢,有時會在內存不足時崩潰。看起來減速(可能是內存崩潰)是在dbms_xslprocessor.processXSL
函數調用的周圍,這需要更長,更長的時間才能完成。大批量XSL操作導致Oracle性能問題
的代碼看起來是這樣的:
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不完全是imple,但我只有一個創造Processor
,一個Transformer
,和一個Stylesheet
,然後一遍又一遍又一遍重複使用它們...
更新2:
即使沒有轉換,內存使用情況不斷增長。幾乎不會壞到崩潰,但它仍然不應該這樣做。非常令人費解。
更新3:
所以......我們的DBA發現某處引用的事實有爲已知的內存泄漏dbms_xmldom
,並可能在dbms_xslprocessor
。問題在新版本的Oracle中得到修復,但是我們沒有這些版本,並且由於沒有立即升級的計劃,我們必須對此進行編碼。
那麼,您的過程聽起來與我們的過程聽起來很相似,因爲我們有30,000個文檔來提取數據,將XML放在一起,然後運行XSLT。是的,當我處理少於2000個文件時,內存問題並不太明顯,但對於最終系統而言,停止和重新啓動下一批2000年的過程並不是很可行。 – FrustratedWithFormsDesigner 2010-05-03 14:02:40
@Jim Hudson:請參閱最近的更新和回覆。 – FrustratedWithFormsDesigner 2010-05-03 14:12:01