Jelaskan, tolong, ini paragraf dari dokumentasi

WAITANY prosedur. Jika Anda menggunakan prosedur WAITANY, dan jika sesi pensinyalan melakukan sinyal tetapi tidak melakukan dalam satu detik dari sinyal, loop polling diperlukan agar peringatan yang tidak dikomit ini tidak menyamarkan peringatan lainnya. Loop polling dimulai pada interval satu detik dan secara eksponensial mundur ke interval 30 detik.

Saya benar memahami bahwa di sini dikatakan bahwa ketika WAITANY dipanggil di server, utas menanyakan keberadaan peristiwa pada interval tertentu? Dan jika saya menelepon WAITANY dengan batas waktu yang cukup lama, ketika suatu peristiwa terjadi, apakah saya akan diberitahu hanya setelah interval permintaan saat ini berakhir? Itu. di server kira-kira seperti kode ini

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;
}
0
Anton Shchyrov 18 November 2017, 13:01

1 menjawab

Jawaban Terbaik

Tidak, itu masih akan "segera".

Ketika seseorang memberi sinyal peringatan, itu akan mengeluarkan pesan pipa (blip non-transaksional) yang akan dilihat pelayan. Tapi tentu saja, pelayan belum "resmi" menerima peringatan sampai pemberi sinyal melakukan.

Jadi pelayan mendapatkan blip, lalu menunggu di kunci (peringatan diimplementasikan dengan mekanisme penguncian standar Oracle). Karena kami mengharapkan komitmen datang dengan cepat.

Jika tidak, itu masalah karena bagaimana jika kita mendapatkan sinyal dari peringatan berbeda (karena kita melakukan WAITANY di sini). Jadi ketika komit itu tidak datang, kami akan menyetujui dan melakukan backoff eksponensial. Tapi itu bukan "periksa peringatan pada 1, 2, 4, dll detik", ini adalah "masukkan kembali ke status menunggu kunci setiap 1, 2,4, ... detik". Jadi ketika komit itu datang, kita akan langsung melihatnya.

Misalnya, saya melacak 2 menit menunggu peringatan dari seseorang yang memberi isyarat tetapi tidak melakukan

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
********************************************************************************

Anda dapat melihat penantian 2 menit hampir semuanya di kunci.

1
Connor McDonald 18 November 2017, 13:47