2017-01-06 46 views
0

我在Oracle中有可以运行数小时的工作,执行大量涉及(但不限于)XmlTransform的计算。我已经注意到PGA内存正在逐渐增加(并且性能下降),直到某些时候内存不足(PGA)消息失败。我们已经应用了一些修复程序,但似乎并未解决问题。 停止作业并重新启动它们,解决了我的问题,性能再次良好,内存也很低... 所有代码都是用PL/SQL和SQL编写的。如何解决Oracle中的内存泄漏

问题: 因为我想尽快解决这个问题,所以想知道如何在Oracle中解决这类问题。

我的主要想法去莫名其妙:

  • 使用高级队列
  • 重启当前会话一段时间(可能是最简单的解决方案)后,重新启动工作?
  • 在另一个会话中同步执行一些代码,也许是另一个工作。

的Oracle 12.1.0.2

编辑:由于这里问的样例代码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

你能或者使用V $ TEMPORARY_LOBS另一个会话的DBA监控温度吊射使用。如果lob的数量在增加,那么会话并没有正确释放它们,这将导致PGA使用量的增加(请注意,这不是泄漏)。

最常见的情况是处理返回一个或多个临时数据块的语句,例如XMLTRANSMFORM()。getClobVal()。 (Java?)开发人员忘记TEMP LOB是SESSION级别的对象,并且由于客户端句柄或引用超出范围而导致与其关联的资源不会被释放。例如,如果您将TEMP lob升级到JAVA Clob对象,则无法依靠垃圾回收来清理LOB。在用下一个高球覆盖它之前,您必须明确地释放该lob,否则服务器将持有LOB资源,直到会话结束。

由于我们没有示例代码,因此我们无法明确说明这是您的情况。

+0

我所有的代码都是用PL/SQL和SQL编写的。你的解释仍然存在吗?尽管如此,我会尝试在xmltransform之后释放lob。 – rvheddeg

+0

它依赖于一个纯粹的PL/SQL过程,它不会返回转换的输出(例如将其存储在数据库中)_不应该担心释放Temp lob,但这仍然是一个好习惯。在PL/SQL中生成的任何LOB都会被传递给客户端,LOBS将成为会话级对象并需要释放。 –

+0

我们再次确实需要查看代码和任何关联的客户端代码。如果它是纯粹的PL/SQL解决方案,您应该能够从PL/SQL块中查询V $ TEMPORARY_LOBS并使用DBMS_OUTPUT输出LOBS的数量。 –