问题描述:
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博客 ” ,链接:http://blog.itpub.net/25105315/viewspace-2132112/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25105315/viewspace-2132112/