取消注册oracle更改通知

时间:2015-03-23 08:20:32

标签: oracle odp.net change-notification

这个主题与Java相关但我无法找到C#的解决方案。 http://theblasfrompas.blogspot.com/2010/01/closing-obsolete-database-change.html

我正在使用带有更改通知的Oracle.ManagedDataAccess.dll。

一切正常,但我有一个问题。当我的应用程序启动时,我创建数据库通知(具有超时0 - 它必须是)并且我已经处理了OracleDependency。 当我的应用程序停止时,我可以使用此句柄以这种方式调用删除注册:

oracleDependency.RemoveRegistration(connection);

当我的应用程序以某种方式崩溃并且我无法调用RemoveRegistration方法时,会出现问题。我失去了对OracleDependency的处理,因此在重新启动应用程序后,我无法删除过时的注册。一如既往,应用程序将创建新的注册,但现在将存在两个 - 一个新的和一个过时的。通过这种方式,我的应用程序将获得两次通知。 问题是 - 如何删除我的应用程序创建的过时通知。

好的,我的进一步调查如下: 我在oracle docs上发现存在静态方法OracleDependency.GetOracleDependency(string guid) 所以在我创建oracle依赖后,我保存了他的Id(似乎是它的guid)。 当我的应用程序停止时,我可以使用此方法来获取我的依赖项。不幸的是,它在应用程序重启后没有工作:/如果我尝试通过此Id获取OracleDependency它返回null但是它存在于USER_CHANGE_NOTIFICATION_REGS中

3 个答案:

答案 0 :(得分:1)

尽管这是一个比较老的问题,但我将描述我在Oracle CQN方面的经验,以防万一它可以帮助某人。该功能与Java一起使用时效果更好,因为Java不仅易于注册,而且还易于注销通知。 在.NET中,如果应用程序崩溃,根据我的经验,无法用代码注销通知。 吊销变更通知无法立即生效。在数据库重新启动之前,注册在撤消之前仍然有效。 与通知接收者的通信出现问题时,Oracle似乎删除了注册。我能够使用此行为取消注册通知。例如,通过打开防火墙! 我用来注销特定Oracle用户的通知的另一个解决方案是我在Java中编写的名为NotificationRegistrationsCleaner.jar的工具。可以从以下链接下载。我们这样称呼它传递4个参数。

java -jar NotificationRegistrationsCleaner.jar [oracle ip] [oracle服务] [oracle用户] [oracle密码]

该工具显示已删除的注册。远非完美,但能胜任。 Java代码与上述@TMtech代码非常相似。

NotificationRegistrationsCleaner.jar

答案 1 :(得分:0)

您可以撤消当前用户的更改通知并再次授予它。我知道,这不是最好的解决方案,但它有效。

答案 2 :(得分: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来执行此代码。

原帖:http://cpp.sh/3zrgr