首页 > 解决方案 > 清除 Clob oracle 消耗的内存

问题描述

我在我的 java 应用程序中使用下面的 oracle 选择查询

select a.xmlrecord.getClobVal() xmlrecord from tablename where ID like 'ABC%' order by ID

执行选择查询后,我正在使用以下代码检索输出并在 finally 块处关闭结果集和连接

Reader reader = new BufferedReader(orset.getCharacterStream("xmlrecord"));

突然我面临以下错误,如下所示

   java.sql.SQLException: ORA-04068: existing state of packages has been discarded 
   ORA-04030: out of process memory when trying to allocate 107112 bytes 

我已经与我的 DBA 进行了核对,他坚持认为错误是由于 JDBC 代码在 xmltype 上调用 getclobVal() 造成的,并且没有检查它是否是临时 lob,也没有代码可以显式释放它。

在方法结束时,我们需要为 Clob 对象关闭什么吗?请注意,我只是在我的查询中使用 clobval(),没有在其他地方使用,我没有在我的代码中创建任何 Clob/lob 对象。

请提供您对上述错误的输入。

标签: oraclememoryclobxmltype

解决方案


getClobVal() 是一个 SQL 函数,它将在服务器上实例化一个 LOB 对象并将适当的 LOB 定位器返回给 Java 客户端。

即使它最初是使用语句持续时间创建的,将定位器返回给客户端的操作也会将 LOB 变形为会话持续时间对象。

您需要更改您的 Java 代码以执行类似...

Clob xmlrecord = orset.getClob("xmlrecord"));
Reader reader = new BufferedReader(xmlrecord.getCharacterStream());

然后你就可以执行...

  xmlrecord.free();

根据您使用的版本,Oracle JDBC 可能会在无需干预的情况下为您释放对象,但无论如何您都应该对此进行编码。如果对象已经被释放,那么它是一个空操作,否则它将被关闭,如果是一个临时 LOB,freeTemporary() 将被调用以释放服务器上的资源。

12.2.0.1 中的错误修复 23205826,特别是 18.1 中的错误修复 26335028 可能会有所帮助。


推荐阅读