2017-09-28 77 views
1

我有一个shell脚本,在满足某些前提条件后会触发PL/SQL报告生成过程。用于检查前提条件是否满足的逻辑用PL/SQL包编写。报告生成需要等到前提条件不满足为止。DBMS_LOCK.SLEEP vs UNIX sleep

在PL/SQL过程中等待使用dbms_lock.sleep vs UNIX sleep有什么优点和缺点?

+0

当您询问dbms_lock.sleep时,我想您正处于一个循环中,在您再次检查您的前提条件之前睡了几秒钟。为什么不用锁把它转向?例如:当前提条件满足时,您释放一个锁(可能触发),您的报告过程正在等待。不需要循环和轮询... – sers

回答

3

就像许多设计决定的答案一样,这取决于。

数据库连接是昂贵且相对耗时的操作。因此,更有效的方法可能是连接数据库一次,让PL/SQL作业处理等待过程。

此外,它可能是一个简单的PL/SQL调用更清洁,让数据库处理报告或睡眠逻辑,而不是编写一个API来返回调用程序必须解释和操作的状态。这也为您提供了一个更好的替代执行路径(例如通过从GUI或DBMS_SCHEDULER作业调用)。

有使用shell脚本sleep的两个具体优点:

  1. 你有充分的循环进入睡眠模式(如果这是互动)的时间发射状态的选项
  2. 执行上sys.dbms_lock是默认情况下不会授予任何人。一些DBA可能不愿意在该包上授予执行权。
+0

我想应该可以为sys.dbms_lock.sleep提供一个包装,以限制对该过程的访问。 –

+0

@davidaldridge - 当然这是可能的,而且确实值得推荐,但有多少DBA很费心去做呢?好消息是,Oracle终于解决了这个问题,在未来的发行版中,'sleep()'将被默认包(例如'dbms_session')添加到公共中。世界等着喘不过气来... – APC