Правильное использование DBMS_ALERT в приложении .NET - PullRequest
1 голос
/ 07 ноября 2019

У меня постоянно работает приложение .NET (служба Windows), которое постоянно слушает таблицу событий в Oracle и выполняет какие-то действия при срабатывании предупреждения. Я использую пакет Oracle.ManagedDataAccess.

Я использую пакет DBMS_ALERT для достижения своей цели.

Следующий код выполняется для прослушивания предупреждений:

string query = "BEGIN " +
                     "  dbms_alert.register(:Name);" +
                     "  dbms_alert.WaitOne(:Name, :Message, :Status, :timeout);" +
                     "  dbms_alert.remove(:Name);" +
               "END;";

Это именно то, что я мог найти в документации Oracle.

Решение работает, но у меня есть 1 небольшая проблема Когда срабатывает предупреждение, мое приложение начинает делать свои вещи, и впараллельно я снова начинаю слушать (асинхронно). Но иногда от удаления оповещения до перерегистрации оповещения уходит несколько секунд. И это происходит много раз, когда я пропускаю оповещения.

Вопросы 1) Есть ли способ, которым я могу продолжать слушать, даже когда срабатывает оповещение, поэтому я не пропускаю ни одногоМероприятия? 2) С функциональной точки зрения мне кажется странным, что мне приходится каждый раз регистрировать и удалять оповещения. Это действительно необходимо?

1 Ответ

0 голосов
/ 11 ноября 2019

Есть ли способ, которым я могу продолжать слушать, даже когда срабатывает оповещение, чтобы я не пропустил никаких событий?

Да. Вы регистрируетесь для прослушивания оповещений один раз за сеанс БД, и впоследствии вы будете получать все оповещения. Нет необходимости перерегистрации.

Если вы хотите получать также оповещения, которые были переданы до регистрации для прослушивания, ознакомьтесь с полной спецификацией процедуры dbms_alert.register, чтобы узнать:

procedure register(name in varchar2, cleanup in boolean default TRUE);
--  Register interest in an alert.  A session may register interest in
--    an unlimited number of alerts.  Alerts should be de-registered when
--    the session no longer has any interest (see 'remove').  This call
--    always performs a 'commit'.
--  Input parameters:
--    name
--      The name of the alert in which this session is interested.
--      WARNING:  Alert names beginning with 'ORA$' are reserved for use for
--      products provided by Oracle Corporation.  Name must be 30 bytes
--      or less.  The name is case-insensitive.
--    cleanup
--      This specifies whether we should perform cleanup of any orphaned
--      pipes that may exist and are used by the dbms_alert package. This
--      cleanup is only performed on the first call to "register" for each
--      package instantiation. The default for the parameter is TRUE.

Примечание второй, необязательный параметр cleanup, по умолчанию true. Передайте его как false, и ваш сеанс никогда не пропустит предупреждение, переданное до регистрации.

С функциональной точки зрения мне кажется странным, что мне приходится регистрироваться и удалять предупреждение каждый раз. Это действительно необходимо?

Нет, в этом нет необходимости.

Что касается перерегистрации, см. Выше.

Что касается удаления предупреждений. .. Это плохо написанный документ. Процедуры remove и removeall не удаляют оповещения из «очереди» оповещений, они просто заставляют сеанс БД прекратить прослушивать оповещения, т. Е. remove противоположен register.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...