2017-01-06 1 views
0

У меня есть рабочие места в Oracle, которые могут работать в течение нескольких часов, выполняя множество вычислений, связанных с (но не ограничиваясь ими) XmlTransform. Я заметил, что память PGA увеличивается (и ухудшается производительность) постепенно, пока в какой-то момент работа не завершится с сообщением об отсутствии памяти (PGA). Мы применили некоторые исправления, но они, похоже, не решают проблему. Остановить работу и перезапустить их, решает мою проблему, производительность снова хороша, а память низкая ... Весь код написан в PL/SQL и SQL.Как устранить утечку памяти в Oracle

Вопрос: Как я хочу решить это как можно скорее, мне было интересно, как я могу обойти этот тип проблемы в Oracle.

Моя главная мысль идет как-то:

  • перезапуском работу после того, как некоторое время (возможно, самое простое решение) с помощью Advanced Queuing
  • перезагрузка текущей сессии?
  • Выполнение некоторого кода синхронно в другой сессии, возможно, другая работа.

Oracle 12.1.0.2

EDIT: Как спросил здесь пример кода с XMLTransform:

function i_Convert_Xml_To_Clob (p_Zoek_Result_Type_Id in Zoek_Result_Type.Zoek_Result_Type_Id%type, 
           p_Xml     in xmltype, 
           p_Xml_Transformation in xmltype) return clob is 
    mResult clob; 
begin 
    if p_Xml_Transformation is not null then 
    select Xmltransform (p_Xml, p_Xml_Transformation).getclobval() 
     into mResult 
    from Dual; 
    elsif p_Xml is not null then 
    mResult := p_Xml.getclobval(); 
    else 
    mResult := null; 
    end if; 

    return mResult; 
end i_Convert_Xml_To_Clob; 
+0

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

+0

@thatjeffsmith, как уже упоминалось, использование памяти увеличивается, но это не должно быть , Я отлично настроил код, но не смог найти возможный источник для увеличения. Я могу как-то перезапустить задания, но это проще сказать, чем сделать. – rvheddeg

+2

да, но мы не можем вам помочь - вам нужно показать нам свой код, ваши следы, показать нам, почему память увеличивается, и почему вы думаете, что это не должно быть – thatjeffsmith

ответ

2

Можете ли вы или DBA монитор использование температуры нескладный из другого сеанса, используя V $ TEMPORARY_LOBS. Если число логов увеличивается, сеанс не освобождает их правильно, и это приведет к увеличению использования PGA (обратите внимание, что это не утечка).

Наиболее распространенный сценарий - обработка инструкции, которая возвращает одну или несколько временных лоб, например XMLTRANSMFORM(). GetClobVal().

Нередко разработчики (Java?) Забывают, что объект TEMP LOB является объектом уровня SESSION, а ресурсы, связанные с ним, не будут освобождены из-за того, что клиентский дескриптор или ссылка выходит из области видимости. Например, если вы получаете клобук TEMP в объект JAVA Clob, вы не можете полагаться на сборку мусора для очистки LOB. Вы должны явно освободить лоб, прежде чем перезаписывать его следующей лапой, или ресурсы LOB будут удерживаться сервером до окончания сеанса.

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

+0

Весь мой код написан в PL/SQL и SQL. Разве ваше объяснение все еще держится? Однако я попытаюсь освободить lob после xmltransform. – rvheddeg

+0

Это зависит от чистой процедуры PL/SQL, которая не возвращает результат преобразования (например, хранит его в базе данных). Не нужно беспокоиться о том, чтобы освободить Temp lob, но это по-прежнему хорошая практика. В тот момент, когда какое-либо из LOB, сгенерированных в PL/SQL, передается клиенту, LOBS становится объектами уровня сессии и нуждается в освобождении. –

+0

Снова нам действительно нужно увидеть код и любой связанный с ним код клиента. Если это чистое решение PL/SQL, вы можете запросить V $ TEMPORARY_LOBS из блока PL/SQL и вывести количество LOBS с использованием DBMS_OUTPUT. –

 Смежные вопросы

  • Нет связанных вопросов^_^