代码之家  ›  专栏  ›  技术社区  ›  FrustratedWithFormsDesigner

大量XSL操作的Oracle性能问题

  •  1
  • FrustratedWithFormsDesigner  · 技术社区  · 16 年前

    我有一个在XMLType对象上执行许多XSL转换的系统。问题是系统会随着时间的推移逐渐变慢,有时会在内存耗尽时崩溃。看来慢下来(可能是内存崩溃)是在 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\u xmldom.newDOMDocument的调用,但我认为这相当简单)。我不知道为什么……:(

    (Oracle 10g)

    通过简单地注释掉调用 processXSL 处理XSL 是什么让事情陷入困境。以前有其他人有过这样的问题吗?

    我们没有转换很多XML文档,现在只有几千个。XSL并不简单,但我只创建了一个 Processor ,一个 Transformer ,还有一个 Stylesheet

    更新2:

    即使没有转换,内存使用量也会不断增长。还没到崩溃的程度,但它仍然不应该这样做。非常令人费解。

    所以。。。我们的数据库管理员在某个地方找到了 已知内存泄漏 dbms_xmldom 可能是在 dbms_xslprocessor . 这些问题在较新版本的Oracle中得到了修复,但我们没有这些版本,而且由于没有立即升级的计划,我们必须对此进行编码。

    2 回复  |  直到 16 年前
        1
  •  2
  •   FrustratedWithFormsDesigner    16 年前

    正如我提到的,我们使用的软件包中似乎存在已知的内存问题,而我使用的Oracle版本没有应用修复程序。我发现我能在他们周围编码。

    最初,我用的是 dbms_xmldom 用片段构建XML文档。我用SELECT(into。。。从dual)语句和XML函数: xmlelement xmlconcat , xmlagg , xmlforest

    为了执行转换,xmltypeapi有一个 transform dbms_xslprocessor 包裹。它运行速度较慢,但似乎更加一致(在速度和内存使用方面),并且在内存不足时不会使系统崩溃。:)

        2
  •  1
  •   Jim Hudson    16 年前

    我们还看到XML处理失败是因为内存不足错误——在XSL处理、创建DOM文档等过程中。

    因此,我建议在进行处理和检查其伸缩性时,让DBA监视内存使用情况。

    在我们的例子中,XSL处理一次只需要对文档的一小部分进行操作。例如,我们在100000个设施上提取数据,XSL在单个设施上转换数据。通过1000或5000人一组进行处理,然后将最终文档拼接在一起,我们能够大大加快速度,减少内存使用。因为我们使用dbms\u xmlgen.getXMLType()从关系表中提取数据来创建XML文档,所以我们可以使用dbms\u xmlgen.setMaxRows来设置块大小。

    其他语言中可用的一些XSL处理器序列化事物,并用时间和空间换取内存使用。但是,据我所知,数据库版本希望引入所有内容并将其作为一个整体进行处理。