Отменить регистрацию уведомления о смене оракула

Эта тема относится к одному из Java, но я не могу найти решение для C#. http://theblasfrompas.blogspot.com/2010/01/closing-obsolete-database-change.html

Я использую Oracle.ManagedDataAccess.dll с уведомлением об изменении.

Все отлично работает, но у меня есть одна проблема. Когда мое приложение запускается, я создаю Уведомление базы данных (с Тайм-аутом 0 - это должно быть), и у меня есть дескриптор OracleDependency. Когда мое приложение остановлено, я могу использовать этот дескриптор для вызова удаления регистрации следующим образом:

oracleDependency.RemoveRegistration(connection);

Проблема возникает, когда мое приложение каким-то образом падает, и я не могу вызвать метод RemoveRegistration. Я теряю контроль над OracleDependency, поэтому после перезапуска приложения я не могу удалить устаревшие регистрации. Как всегда при запуске приложение создаст новую регистрацию, но теперь будет существовать ДВА - одна новая и одна устаревшая. Таким образом, мое приложение получит уведомление два раза. Вопрос в том, как удалить устаревшие уведомления, созданные моим приложением.

Итак, мое дальнейшее исследование приведено ниже: я обнаружил в документах oracle, что существует статический метод OracleDependency.GetOracleDependency (строка guid). Поэтому после создания зависимости oracle я сохраняю его Id (кажется, его guid). Когда мое приложение остановлено, я могу использовать этот метод, чтобы получить свою зависимость. К сожалению, это не сработало после перезапуска приложения: / Если я пытаюсь получить OracleDependency по этому идентификатору, он возвращает ноль, но в USER_CHANGE_NOTIFICATION_REGS существует strill

3 ответа

Хотя это довольно старый вопрос, я опишу свой опыт работы с Oracle CQN на случай, если он кому-нибудь поможет. Эта функция лучше работает с Java, где ее легко не только зарегистрировать, но и отменить уведомление. В.NET, если приложение дает сбой, я не могу отменить регистрацию уведомления с помощью кода. Отзыв уведомления об изменении не работает сразу. До перезапуска базы данных регистрация переживала отзыв. Похоже, что Oracle удаляет регистрацию, когда возникает проблема в связи с получателем уведомлений. Мне удалось отменить регистрацию уведомлений, используя это поведение. Например, включив брандмауэр! Другое решение, которое я использую для отмены регистрации уведомлений для конкретного пользователя оракула, - это инструмент, который я написал в java с именем NotificationRegistrationsCleaner.jar. Его можно скачать по следующей ссылке. Мы называем это передачей 4 параметров, вот так.

java -jar NotificationRegistrationsCleaner.jar [IP-адрес оракула] [служба оракула] [пользователь оракула] [пароль оракула]

Инструмент отображает удаленные регистрации. Далеко не идеально, но делает свою работу. Код Java очень похож на код @TMtech, описанный выше.

NotificationRegistrationsCleaner.jar

Java реализация для удаления всех регистраций уведомлений об изменениях из базы данных

Statement stmt= conn.createStatement();
ResultSet rs = stmt.executeQuery("select regid,callback from USER_CHANGE_NOTIFICATION_REGS");
while(rs.next())
{
  long regid = rs.getLong(1);
  String callback = rs.getString(2);
  ((OracleConnection)conn).unregisterDatabaseChangeNotification(regid,callback);
}
rs.close();
stmt.close();

У вас должен быть ojdbc6/7.jar в пути к классам, чтобы выполнить этот код.

Исходное сообщение: https://community.oracle.com/message/9315024

Вы можете просто отозвать уведомление об изменении от текущего пользователя и предоставить его снова. Я знаю, это не лучшее решение, но оно работает.

Другие вопросы по тегам