Оповещение клиентов о событиях

stells2
Дата: 21.11.2009 15:15:03
Оповещение клиентов о событиях

Доброго времени.
Есть необходимость у клиентов постоянно держать актуальные наборы данных. Но сажать их на таймер и тупо опрашивать базу с заданной периодичностью, думаю не есть хорошо.
Для примера – возможно изменение в течении 1 часа анализов – 4 раза, у пользователя должны отобразиться эти данные с минимальной задержкой.. Событие анализа есть случайная величина, следовательно, вешать таймер с интервалом в 1-5 сек или.. что или?
Например, в FireBird есть события которые запросто можно сгенерить в той же процедуре вставки.
Подскажите пожалуйста, есть ли механизм в Oracle для отслеживания заданных изменений и оповещать клиентов..

Были идеи реализовать на java функции посылки сообщений клиентом (функции вызываются в нужном месте, например в процедуре вставки/обновления.. Но, тогда на клиентах надо кодировать сервер для прослушки определенного порта..
Наверняка есть стандартные механизмы в Oracle и можно не изобретать велосипед..
Заранее спасибо.
suPPLer
Дата: 21.11.2009 15:23:54
stells2,

0. У клиентов в чём? В гриде на форме?
1. Как насчёт Oracle Advanced Queueing?
stells2
Дата: 21.11.2009 15:45:16
suPPLer
stells2,

0. У клиентов в чём? В гриде на форме?
1. Как насчёт Oracle Advanced Queueing?


Ну.. у клиентов - АРМ на C# написаны, есть и гриды, и тестовые поля и лейбочки.. в общем как обычно.. Да, как правило, это визуальные компоненты. (хотя, если дорожка будет проторена.. то что мешает аналогично службе получать сообщение и реагировать.. :) )

А за Oracle Advanced Queueing спасибо, не знаю что это такое - сейчас буду читать..
Может, у кого есть опыт, кто-то сталкивался с аналогичной задачей?
Просто, это сейчас встало в виде вполне реальной задачи.
Есть change query notification
Дата: 24.11.2009 17:28:41
Есть change query notification - как раз для этих целей
Authors
Дата: 25.11.2009 14:46:36
Есть change query notification
Есть change query notification - как раз для этих целей


А есть самый простой пример использования например для C#?
И еще, я вот тут попробовал для PL/SQL так он при DBMS_CHANGE_NOTIFICATION.NEW_REG_START ругается: Ora-29975. Что это может быть?
andrey_anonymous
Дата: 25.11.2009 14:47:50
Authors
Ora-29975. Что это может быть?

-bash-3.00$ oerr ora 29975
29975, 0000, "Cannot register a query in the middle of an active transaction"
// *Cause: User tried to register a query within an uncommitted transction.
// *Action: Commit the transaction and retry.
Authors
Дата: 25.11.2009 14:54:55
andrey_anonymous
Authors
Ora-29975. Что это может быть?

-bash-3.00$ oerr ora 29975
29975, 0000, "Cannot register a query in the middle of an active transaction"
// *Cause: User tried to register a query within an uncommitted transction.
// *Action: Commit the transaction and retry.


Да нет ну я же не с пальмы слез и сразу такие вопросы начал задавать. Текст ошибки я читал.
Хоть с commit, хоть с rollback, хоть в новой сессии - одно и то же.
Authors
Дата: 25.11.2009 15:04:11
На 10.2.0.1 под Linux все ОК!
На 10.2.0.3 под WIN - Ora-29975

Пример один к одному
stells2
Дата: 28.04.2010 22:34:03
В общем то таки да, пара тривиальных решений
1. dbms_alert.signal(...)
2. Change Notification

Change Notification требует клиента (на тот случай, если используется прямое подключение.. этот вариант не прокатит). Но, довольно удобно и наверно "правильно" :)

использовать события dbms_alert немного гибче, как мне кажется, но и не совсем порой оптимально (например, посылаем сигнал в триггере - надо как минимум в двух Insert/Update прописать..) С другой стороны, на стороне клиента, если делать ручками, никто не запрещает открыть сокет в отдельном потоке и слушать порт.. В этом случае, ни клиент ни чего не надо. Хотя, есть уже готовые компоненты (например - Oracle Data Access Components (ODAC) есть для Delphi/CBuilder/.NET, только версия нужна не ниже pro).

Было бы интересно услышать мнение опытных на этот счет, в плане "плюсов" и "минусов" того или иного.
comphead
Дата: 28.04.2010 23:35:20
stells2
В общем то таки да, пара тривиальных решений
1. dbms_alert.signal(...)
2. Change Notification

Change Notification требует клиента (на тот случай, если используется прямое подключение.. этот вариант не прокатит). Но, довольно удобно и наверно "правильно" :)

использовать события dbms_alert немного гибче, как мне кажется, но и не совсем порой оптимально (например, посылаем сигнал в триггере - надо как минимум в двух Insert/Update прописать..) С другой стороны, на стороне клиента, если делать ручками, никто не запрещает открыть сокет в отдельном потоке и слушать порт.. В этом случае, ни клиент ни чего не надо. Хотя, есть уже готовые компоненты (например - Oracle Data Access Components (ODAC) есть для Delphi/CBuilder/.NET, только версия нужна не ниже pro).

Было бы интересно услышать мнение опытных на этот счет, в плане "плюсов" и "минусов" того или иного.


минус dbms_alert это неявный коммит при каждом действии. т.е. в транзакции его применять нельзя. максимум автономная.