2017-11-18 139 views
0

解释,请点击这里本段从文档DBMS_ALERT轮询间隔

WAITANY程序。如果您使用WAITANY过程,并且如果信令会话执行信号但在信号的一秒钟内未提交,则需要轮询循环,以便此未提交的警报不会伪装其他警报。轮询循环从一秒钟间隔开始,并以指数方式退避至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

不,它仍然是“立即”。

当有人发出警报时,会弹出服务员将看到的管道消息(非事务性消息)。但当然,服务员在信号员提交之前还没有“正式”收到警报。

因此,服务员得到blip,然后等待锁(警报通过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分钟的等待是几乎所有的锁等待。