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

8
Опыт использования Object Change Notification Петрелевич Сергей [email protected] www.orahome.ru 1

description

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

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

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

1

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

Петрелевич Сергей[email protected]

www.orahome.ru

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

2

Потребность

• Карточная система АБС

Петрелевич Сергей [email protected]

Function()Card

(Table tCard_obj)

Изменения Card должны передаваться в режиме OnLine

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

3

Что такое OCN?

Петрелевич Сергей [email protected]

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

4

Как создать?procedure RegisterHandlerCard is vNotif cq_notification$_reg_info; vRegId number; vCursor sys_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;

Петрелевич Сергей [email protected]

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

5

Как обрабатывать?procedure HandlerCard(ntfnds IN SYS.CHNF$_DESC) is vDataCard tCard_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;

Петрелевич Сергей [email protected]

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

6

Какие проблемы?

• Переполнение списка RowId• Число параллельных Job’ов

(JOB_QUEUE_PROCESSES)• Непрозрачность списка уведомленийРешение• Дополнительная логика в обработчике

см. BatchProcess в примере

• Использование буферной таблицы

Петрелевич Сергей [email protected]

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

7

Как управлять?

• Список зарегистрированных обработчиковDBA_CHANGE_NOTIFICATION_REGS

• Список зарегистрированных запросовDBA_CQ_NOTIFICATION_QUERIES

(Best- Effort Mode)• Количество параллельных уведомлений

JOB_QUEUE_PROCESSES• Ошибки выполнения

ORACLE_SID_jnumber_PID.trcПетрелевич Сергей [email protected]

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

8

Вопросы?

Петрелевич Сергей [email protected]