2017-11-18 23 views
0

は、ドキュメントDBMS_ALERTポーリング間隔

WAITANY手順から、してください、ここではこの段落を説明します。 WAITANYプロシージャを使用していて、シグナリングセッションがシグナルを出してもシグナルの1秒以内にコミットしない場合は、このコミットされていないアラートが他のアラートを偽装しないようにポーリングループが必要です。ポーリングループは1秒間隔で開始し、指数関数的に30秒間隔に戻ります。

ここで、WAITANYがサーバー上で呼び出されると、スレッドは特定の間隔でイベントの存在をクエリすると正しく認識されていますか?また、WAITANYに十分長いタイムアウトを設定した場合、イベントが発生すると、現在の要求間隔が経過した後にのみ通知されますか?それら。サーバー上のこのコードのようなものです

function WaitAny(ATimeout) { 
    const intervals = [0, 1, ....., 30); 
    for (i = 0; i < intervals.length; i++) { 
    Sleep(min(intervals[i], ATimeout)) 
    if (IsExistsEvents()) 
     return 0; 
    ATimeout -= intervals[i]; 
    if (ATimeout <= 0) 
     return 1; 
    } 
    maxInterval = intervals[intervals.length - 1]; 
    while (ATimeout > 0) { 
    Sleep(min(maxInterval, ATimeout)) 
    if (IsExistsEvents()) 
     return 0; 
    ATimeout -= maxInterval; 
    } 
    return 1; 
} 

答えて

1

いいえ、それはまだ "即時"になります。

誰かがアラートを送信すると、ウェイターに表示されるパイプメッセージ(トランザクション以外のブリップ)がフリックされます。しかし、もちろん、ウェイターは、署名者がコミットするまで「公式に」アラートを受け取っていません。

したがって、ウェイターはブリップを取得し、ロックを待機します(アラートはOracleの標準的なロック機構で実装されます)。コミットがすぐに来ることを期待しているからです。

から別のアラート(ここではWAITANYを実行しているため)からの信号を受け取った場合には問題です。だから、そのコミットが来なかったら、私たちは黙って指数関数的なバックオフをします。しかし、それは "1秒間、2秒間、4秒間などのアラートをチェックする"ではなく、 "1,2,4、...秒ごとにロック状態を待つ"と再入力します。だから、そのコミットが来たら、すぐにそれをすぐに見るでしょう。

は例えば、私が合図が、あなたは2分間の待機がロック待機にほとんどすべてだった見ることができます

declare 
    n varchar2(100); 
    m varchar2(100); 
    s int; 
begin 
    dbms_alert.WAITANY(n,m,s); 
end; 

call  count  cpu elapsed  disk  query current  rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse  1  0.00  0.00   0   0   0   0 
Execute  1  0.00  127.49   0   0   0   1 
Fetch  0  0.00  0.00   0   0   0   0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total  2  0.00  127.50   0   0   0   1 

Misses in library cache during parse: 1 
Optimizer mode: ALL_ROWS 
Parsing user id: 107 

Elapsed times include waiting on following events: 
    Event waited on        Times Max. Wait Total Waited 
    ---------------------------------------- Waited ---------- ------------ 
    enq: UL - contention       9  32.01  127.47 
    log file sync         1  0.00   0.00 
    SQL*Net message to client      1  0.00   0.00 
    SQL*Net message from client      1  0.00   0.00 
******************************************************************************** 

を犯していない人からの警告に2分間の待機をトレースし。