2015-03-23 6 views
2

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

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

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

oracleDependency.RemoveRegistration(connection); 

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

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

ответ

0

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

0

реализации 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#9315024