首页 > 应用开发 > IT综合 > library cache pin(3)
其他解决方法
当重新编译某个package时,应确认当前没有session在使用此package中的object. 当我们重新编译某个package时,如果有session正在执行此package中的procedure或function,那么编译就会挂起. 因为编译或分析(parse)package或procedure或function或view时,Oracle需要先取得”library cache lock”和”library cache pin”以保证在编译或分析(parse)期间没有session正使用此object – 因为我们正修改此object的定义并需要删除后用新的定义来重建此object.
我们可以用以下procedure来检查是否有session正在使用某个package,如果此procedure有结果返回,则此时不能编译此package,
sql> Connect SYS
password:
sql> set serveroutput on
sql>create or replace procedure who_is_using(obj_name varchar2) is
begin
dbms_output.enable(1000000);
for i in (SELECT distinct b.username,b.sid
FROM SYS.x$kglpn a,v$session b,SYS.x$kglob c
WHERE a.KGLPNUSE = b.saddr
and upper(c.KGLNAOBJ) like upper(OBJ_NAME)
and a.KGLPNHDL = c.KGLHDADR) loop
dbms_output.put_line('('||to_char(i.sid)||') - '||i.username);
end loop;
end;
sql>execute who_is_using('my_package%');
(14) – SCOTT #即scott用户正在执行 my_package
以下查询可得到正使用此package的session是否正占着”library cache pin”锁或正等待”library cache pin”锁:
sql>SELECT a.KGLPNMOD, a.KGLPNREQ, b.username, c.KGLNAOBJ,
c.KGLOBTYP
FROM
x$kglpn a,
v$session b,
x$kglob c
WHERE
a .KGLPNUSE = b.saddr and
upper(c.KGLNAOBJ) like upper('%my_package%') and
a.KGLPNHDL = c.KGLHDADR;
与LIBRARY CACHE PIN相关的参数
在OPS 8.1.5, 8.1.6和8.1.7.0中,一定要在initsid.ora文件中设置
_SQLEXEC_PROGRESSION_COST=0以避免因session等待”library cache pin”而造成的数据库性能严重下降或数据库挂起.
结束语
以上介绍了”library cache pin”的定义,产生原因及对数据库性能的影响,给出了详
细的分析步骤和解决方法,本文适合较有经验的数据库管理员阅读.
本文中给出的SQL语句请先测试后才能使用.
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/18921899/viewspace-1017598/ ,如需转载,请注明出处,否则将追究法律责任。