2017-09-28 75 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