2016-12-06 83 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

很好的答案。唯一的事情是,在睡覺之前不應該有任何交易或鎖定,否則可能會阻止某些東西。 –