oracle - 清除 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 对象。
请提供您对上述错误的输入。
解决方案
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 可能会有所帮助。
推荐阅读
- java - JAVA - 将用户输入打印到 HTML
- javascript - 在 JavaScript 中,如何以简单的方式检查“a”与“b”、“c”等?
- java - ExpandableRecyclerView - 如何同时展开和折叠多个 CardView
- javascript - 红色节点 - 遍历 UniFi API 数组数据
- r - “for”,具有两个不同的索引 i 和 j,用于创建绘图
- android - 从 Android JobService 绑定到 Android 服务
- python - 为什么 python3.7 使用 re.split() 返回与 python3.6(anaconda) 不同的输出?
- javascript - 将变量传递到 document.getElementById() - Javascript
- json - laravel 按数据字段为用户选择通知
- chapel - 各种计算的性能图