问题描述:
Oracle的临时表空间使用一直在缓慢增长,理论上临时表空间是重复使用的。但是从临时表空间使用率缓慢增长,临时表空间没有释放过。
-
日期 临时表空间 当前大小(G)
-
--------------------------------------
-
2014/1/3 TEMP 85
-
2014/1/2 TEMP 74
-
2014/1/1 TEMP 64
-
2013/12/31 TEMP 45
-
2013/12/30 TEMP 13
-
2013/12/29 TEMP 13
问题分析:
业务也没有类似增长,所以应该不是业务导致的。从每天的增长看,是逐步累积的。经过检查发现占用临时表空间的语句访问了LOB对象。
和开发沟通,和clob相关的代码如下:
-
if p_benefit_str is not null then
-
v_length := length(p_benefit_str);
-
if v_length > 0 then
-
dbms_lob.open(p_benefit_clob,dbms_lob.lob_readwrite);
-
dbms_lob.writeappend(p_benefit_clob, v_length, p_benefit_str);
-
dbms_lob.close(p_benefit_clob);
-
end if;
-
end if;
根据metalink文章,是lob在使用完成后需要free的。
-
declare
-
clb clob;
-
ch varchar2(32767);
-
k number;
-
begin
-
dbms_lob.createtemporary(clb,true,dbms_lob.call);
-
for i in 1..1500 loop
-
ch:=lpad('o',32767,'Y');
-
dbms_lob.writeappend(clb,length(ch),ch);
-
end loop;
-
k:=dbms_lob.getlength(clb);
-
dbms_lob.freetemporary(clb);
-
dbms_output.put_line('the clob length: '||k);
-
end;
-
/
如果在java端调用后,可以在java端进行回收。
-
1.java.sql.NClob.free()
-
2.oracle.sql.NCLOB.freeTemprary()
-
3.(OracleCallableStatement) conn.prepareCall("begin DBMS_LOB.FREETEMPORARY ( ? ); end;");
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25105315/viewspace-2132112/
,如需转载,请注明出处,否则将追究法律责任。