Опыт использования Object Change Notification Петрелевич Сергей

advertisement
Опыт использования
Object Change Notification
Петрелевич Сергей
petrelevich@yandex.ru
www.orahome.ru
1
Потребность
• Карточная система
АБС
Card
(Table tCard_obj)
Function()
Изменения Card должны передаваться в режиме OnLine
Петрелевич Сергей petrelevich@yandex.ru
2
Что такое OCN?
Петрелевич Сергей petrelevich@yandex.ru
3
Как создать?
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;
Петрелевич Сергей petrelevich@yandex.ru
4
Как обрабатывать?
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;
Петрелевич Сергей petrelevich@yandex.ru
5
Какие проблемы?
• Переполнение списка RowId
• Число параллельных Job’ов
(JOB_QUEUE_PROCESSES)
• Непрозрачность списка уведомлений
Решение
• Дополнительная логика в обработчике
см. BatchProcess в примере
• Использование буферной таблицы
Петрелевич Сергей petrelevich@yandex.ru
6
Как управлять?
• Список зарегистрированных обработчиков
DBA_CHANGE_NOTIFICATION_REGS
• Список зарегистрированных запросов
DBA_CQ_NOTIFICATION_QUERIES
(Best-Effort Mode)
• Количество параллельных уведомлений
JOB_QUEUE_PROCESSES
• Ошибки выполнения
ORACLE_SID_jnumber_PID.trc
Петрелевич Сергей petrelevich@yandex.ru
7
Вопросы?
Петрелевич Сергей petrelevich@yandex.ru
8
Download