避免编译Oracle包时挂起
Posted
技术标签:
【中文标题】避免编译Oracle包时挂起【英文标题】:Avoid hanging while compiling Oracle package 【发布时间】:2015-06-25 08:53:42 【问题描述】:我们有一种情况,包的编译需要永远! 如果我们用新名称编译包,那么它就可以工作了!
据我所知,编译挂起是因为包上的锁!
这样的事情可能有助于识别问题!
SELECT s.sid,
l.lock_type,
l.mode_held,
l.mode_requested,
l.lock_id1,
FROM dba_lock_internal l,
v$session s
WHERE s.sid = l.session_id
AND UPPER(l.lock_id1) LIKE '%PROCEDURE_NAME%'
AND l.lock_type = 'Body Definition Lock';
还有这个
select
x.sid
from
v$session x, v$sqltext y
where
x.sql_address = y.address
and
y.sql_text like '%PROCEDURE_NAME%';
是否只有 'body Definition Lock' 会阻止编译? 是否还有其他阻止编译的锁类型?
如何避免锁并进行编译?只杀死会话?还有别的吗?
【问题讨论】:
【参考方案1】:您可能想查看Edition-based Redefinition,它可以让您创建新修订版、编译新版本而不会被当前使用这些包的其他会话阻止并稍后启用新修订版。
【讨论】:
听起来很有希望,我会试试看 :)【参考方案2】:基本上,如果有人或其他东西(任何其他计划的作业)正在执行包,那么您将无法执行重新编译。为了解决这个问题,您需要识别锁定会话并将其终止。终止会话是我们拥有的选项,dbms_lock 仅对 dbms_lock 创建的锁有用 您不能只是“解锁”某个对象 - 锁存在的原因非常相关。
您可能遇到的其他锁是 依赖锁:考虑一下 包 A 中的过程 1 包含对包 B 中的过程 2 的调用。 包 A 中的程序 1 正在运行。 那么你在编译Package-B时可能会被锁
【讨论】:
以上是关于避免编译Oracle包时挂起的主要内容,如果未能解决你的问题,请参考以下文章
ResultSet.next() 在使用 jdbc 与 oracle 11.2 交谈时挂起
oracle spool 脚本在 cmd.exe 中工作,但在从代码调用时挂起