В настоящее время используется OAQ в качестве очереди сообщений для получения событий журнала. Oracle 11gr2
Что-то действительно простое, как
PROCEDURE insert_queue(p_new_rec ag$lds_evt.evt_rec_typ, p_old_rec ag$lds_evt.evt_rec_typ) IS
enqueue_options DBMS_AQ.ENQUEUE_OPTIONS_T;
message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
message_handle RAW(16);
MESSAGE ldsi_aq_event_updates_type;
BEGIN
MESSAGE := ldsi_aq_event_updates_type(COALESCE(p_new_rec.channel_type, p_old_rec.channel_type),
NVL(p_new_rec.lot_id, p_old_rec.lot_id),
COALESCE(p_new_rec.lot_lotid, p_old_rec.lot_lotid),
COALESCE(p_new_rec.lot_system_code, p_old_rec.lot_system_code),
NVL(p_new_rec.id, p_old_rec.id),
NVL(p_new_rec.evtt_id, p_old_rec.evtt_id),
p_new_rec.evtt_code,
p_old_rec.target_area,
p_new_rec.target_area,
p_old_rec.solved_ny,
p_new_rec.solved_ny,
p_old_rec.delegated_ny,
p_new_rec.delegated_ny);
enqueue_options.visibility := DBMS_AQ.immediate;
DBMS_AQ.enqueue(queue_name => 'LDSI_TMP_OWNER.LDSI_AQ_EVENT_UPDATES',
enqueue_options => enqueue_options,
message_properties => message_properties,
payload => MESSAGE,
msgid => message_handle);
END;
и для Dequeue мы получили
PROCEDURE dequeue_event(context IN RAW,
reginfo IN SYS.AQ$_REG_INFO,
descr IN SYS.AQ$_DESCRIPTOR,
payload IN RAW,
payloadl IN NUMBER) IS
l_dequeue_options DBMS_AQ.DEQUEUE_OPTIONS_T;
l_message_properties DBMS_AQ.MESSAGE_PROPERTIES_T;
l_message_handle RAW(16);
l_message ldsi_aq_event_updates_type;
BEGIN
l_dequeue_options.wait := DBMS_AQ.no_wait;
l_dequeue_options.msgid := descr.msg_id;
l_dequeue_options.consumer_name := descr.consumer_name;
DBMS_AQ.dequeue(queue_name => descr.queue_name,
dequeue_options => l_dequeue_options,
message_properties => l_message_properties,
payload => l_message,
msgid => l_message_handle);
ldsi_event.update_mrb_b(p_message => l_message);
COMMIT;
END;
Мы зарегистрировали подписчика, который все автоматически отключает.
Это работает нормально, до тех пор, пока не пройдет много трафика ... когда очередь начинает складываться, она начинает блокировать все задания по расписанию, а затем в конечном итоге дает сбой оракулу.
Есть ли какое-то ограничение на количество сообщений в секунду, которое оно может поддерживать? это может быть проблема с ресурсом?