2016-12-06 48 views
2

当它“睡觉”或其他一些不希望的副作用影响时,它会绑定一个CPU吗?PL/SQL函数dbms_lock.sleep是否安全?

是的 - 偏执狂,但与一些关键的代码工作,并不想任何陷阱。

+2

它会做空闲的等待。不过,“不良副作用”有点宽泛。对于线程何时被唤醒有一个相当大的不确定性 - 例如,如果你睡了几秒钟,你可能会在十分之一秒后醒来。如果你睡了几秒钟,就不需要担心了。 –

+0

在我的情况下,精度并不重要。我正在处理一个系统超载另一个系统导致其崩溃的情况。我正在寻找一种方法来优雅地“扼杀”在目标系统上抛出多少东西。睡眠似乎是做这件事的理想方式。 – Jeff

+1

这可能是完全合理的。根据问题的范围,您可能需要一个进程可以将消息排入队列的异步队列,而另一个进程(或多个进程)可以稍后再出队。这样,消费者流程就可以自我调节,而不需要生产者知道如何节制。 –

回答

3

DBMS_LOCK.SLEEP不消耗任何重要资源,使用起来非常安全。

我已经多次使用过它,从未遇到任何问题。下面的测试会创建大量的睡眠工作,但不会导致任何问题。


要测试SLEEP功能,创造了巨大的就业量都睡在同一时间。

首先,确保数据库可以支持大量的作业。有几个参数可能会限制这一点。检查以下参数:

select name, value 
from v$parameter 
where name in ('job_queue_processes', 'processes', 'sessions') 

创建1000个等待30秒的预定作业。

begin 
    for i in 1 .. 1000 loop 
     dbms_scheduler.create_job(
      job_name => 'JOB_'||i, 
      job_type => 'PLSQL_BLOCK', 
      start_date => systimestamp, 
      enabled => true, 
      job_action => 'begin dbms_lock.sleep(30); end;' 
     ); 
    end loop; 
end; 
/

现在看到有多少作业正在运行:

select count(*) from gv$session where schemaname = user; 
select count(*) from dba_scheduler_running_jobs where owner = user; 

在我的桌面上我只得到239点的工作。由于原始参数不是1000,但我认为239仍然是一个很好的“大”值。

即使在所有这些活动中,我都没有注意到任何性能问题,Oracle使用的CPU不到1%。

+1

很好的答案。唯一的事情是,在睡觉之前不应该有任何交易或锁定,否则可能会阻止某些东西。 –