在 Oracle 11g 中,我们使用XMLELEMENT
从表中获取记录。然而,问题似乎是,我们正在调用SELECT XMLELEMENT(...).getClobVal() from DUAL;
哪个正在像三明治一样吃掉我们的临时表空间。
我读到我们可以使用 杀死 blob 记录FREETEMPORARY(blob_ref)
,但在上面显示的格式中,我们没有引用 blob。有什么办法可以得到一个吗?
因为这是从一个程序运行的,而且我们使用的库为我们生成了 PL/SQL 块,所以它真的不能重组为 PL/SQL 语句。
DBCP 是我们与 Tomcat 一起使用的连接池,而 Spring 的 JdbcTemplate 是我们用来运行查询的。考虑到 JdbcTemplate 为我们交换了绑定变量,我们假设它正在幕后创建一个匿名块。
运行select * from v$temporary_lobs;
显示,对于当前会话,我的列中仍有 4 个ABSTRACT_LOBS
。这是在 SQL Developer 中自行运行查询(无匿名块)四次之后的结果。
David Mann最初在评论中留下的答案:
如果您无法运行,
FREETEMPORARY
那么我相信您唯一的选择是断开/重新连接会话。这将导致清除该会话使用的任何临时 blob 空间。这里有一个类似的问题,我们无法触及应用程序代码,所以我们最终调整了他们的连接池以更频繁地过期和重新连接。Oracle Metalink 文档 ID 802897.1“如何释放临时 LOB 空间并避免命中 ORA-1652”对此进行了介绍,对于 11g,您可以选择调用
FREETEMPORARY
或退出会话。他们还提到了一个新事件 60025,它应该在不再使用会话的所有临时 LOB 时释放临时段,但我没有看到任何其他细节。