1 / 8

Опыт использования Object Change Notification

Опыт использования Object Change Notification. Петрелевич Сергей petrelevich@yandex.ru www.orahome.ru. Потребность. Карточная система АБС. Function(). Card (Table tCard_obj ). Изменения Card должны передаваться в режиме OnLine. Что такое OCN?.

Download Presentation

Опыт использования Object Change Notification

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Опыт использования Object Change Notification Петрелевич Сергей petrelevich@yandex.ru www.orahome.ru

  2. Потребность • Карточная система АБС Function() Card(Table tCard_obj) Изменения Card должны передаваться в режиме OnLine Петрелевич Сергей petrelevich@yandex.ru

  3. Что такое OCN? Петрелевич Сергей petrelevich@yandex.ru

  4. Как создать? procedure RegisterHandlerCard is vNotifcq_notification$_reg_info; vRegIdnumber; vCursorsys_refcursor; begin vNotif:= new cq_notification$_reg_info ( callback => 'BANK_OCN.HANDLERCARD', qosflags => DBMS_CQ_NOTIFICATION.QOS_ROWIDS, timeout => 0, operations_filter => DBMS_CQ_NOTIFICATION.INSERTOP+DBMS_CQ_NOTIFICATION.UPDATEOP;, transaction_lag => 0 ); vRegId:= dbms_cq_notification.new_reg_start(vNotif); open vCursor for select t.updateRevision from tCard_obj t where t.SomeValue = 32; close vCursor; dbms_cq_notification.reg_end; commit; end; Петрелевич Сергей petrelevich@yandex.ru

  5. Как обрабатывать? procedure HandlerCard(ntfnds IN SYS.CHNF$_DESC) is vDataCardtCard_obj%rowtype; begin for q in 1..ntfnds.TABLE_DESC_ARRAY.count loop if NVL(ntfnds.TABLE_DESC_ARRAY(q).numrows,0)=0 then BatchProcess(vCardlistChange, vCardlistCreate);--Пакетные операции else for r in 1..ntfnds.TABLE_DESC_ARRAY(q).ROW_DESC_ARRAY.count loop select t.* into vDataCard from tCard_obj t where t.RowId=chartorowid(ntfnds.TABLE_DESC_ARRAY(q).row_desc_array(r).row_id); if ntfnds.TABLE_DESC_ARRAY(q).row_desc_array(r).opflags=dbms_change_notification.INSERTOP then vCardlistCreate(vDataCard.Pan):=vDataCard; end if; if ntfnds.TABLE_DESC_ARRAY(q).row_desc_array(r).opflags=dbms_change_notification.UPDATEOP then vCardlistChange(vDataCard.Pan):=vDataCard; end if; end loop; end if; end loop; end; Петрелевич Сергей petrelevich@yandex.ru

  6. Какие проблемы? • Переполнение списка RowId • Число параллельных Job’ов (JOB_QUEUE_PROCESSES) • Непрозрачность списка уведомлений Решение • Дополнительная логика в обработчике см. BatchProcess в примере • Использование буферной таблицы Петрелевич Сергей petrelevich@yandex.ru

  7. Как управлять? • Список зарегистрированных обработчиков DBA_CHANGE_NOTIFICATION_REGS • Список зарегистрированных запросов DBA_CQ_NOTIFICATION_QUERIES (Best-Effort Mode) • Количество параллельных уведомлений JOB_QUEUE_PROCESSES • Ошибки выполнения ORACLE_SID_jnumber_PID.trc Петрелевич Сергей petrelevich@yandex.ru

  8. Вопросы? Петрелевич Сергей petrelevich@yandex.ru

More Related