注销oracle更改通知

注销oracle更改通知,oracle,odp.net,change-notification,Oracle,Odp.net,Change Notification,本主题与Java中的主题相关,但我无法找到C#的解决方案。 我正在使用带有更改通知的Oracle.ManagedDataAccess.dll 一切正常,但我有一个问题。当我的应用程序启动时,我会创建数据库通知(超时为0-必须是),并且我可以处理OracleDependency。 当我的应用程序停止时,我可以使用此句柄以以下方式调用remove registration: oracleDependency.RemoveRegistration(connection); 当我的应用程序以某种方式

本主题与Java中的主题相关,但我无法找到C#的解决方案。

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

一切正常,但我有一个问题。当我的应用程序启动时,我会创建数据库通知(超时为0-必须是),并且我可以处理OracleDependency。 当我的应用程序停止时,我可以使用此句柄以以下方式调用remove registration:

oracleDependency.RemoveRegistration(connection);
当我的应用程序以某种方式崩溃,并且我无法调用RemoveRegistration方法时,就会出现问题。我失去了对OracleDependency的控制,所以在重新启动应用程序后,我无法删除过时的注册。一如往常,启动应用程序将创建新的注册,但现在将存在两个-一个新的和一个过时的。这样,我的应用程序将收到两次通知。 问题是-如何删除应用程序创建的过时通知

好的,我的进一步调查如下: 我在oracle文档中发现存在静态方法OracleDependency.GetOracleDependency(字符串guid) 因此,在创建oracle依赖项之后,我保存了他的Id(似乎是它的guid)。
当我的应用程序停止时,我可以使用此方法获取依赖项。不幸的是,它在应用程序重新启动后不起作用:/如果我试图通过此Id获取OracleDependency,它将返回null,但它将存在于用户更改通知注册表中。

您只需从当前用户撤销更改通知并再次授予它即可。我知道,这不是最好的解决方案,但它可以工作。

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


原始帖子:

虽然这是一个相当老的问题,但我将描述我在Oracle CQN方面的经验,以防它对某人有所帮助。该特性在java中工作得更好,因为java不仅易于注册,而且可以取消注册通知。 在.NET中,如果应用程序崩溃,根据我的经验,无法用代码注销通知。 取消更改通知无法立即生效。在数据库重新启动之前,注册在撤销后仍然有效。 Oracle似乎会在与通知接收方的通信出现问题时删除注册。我可以使用此行为注销通知。例如,打开防火墙! 我用来注销特定oracle用户通知的另一个解决方案是我用java编写的名为NotificationRegistrationsCleaner.jar的工具。可以从以下链接下载。我们称之为传递4个参数,如下所示

java-jar NotificationRegistrationsCleaner.jar[oracle ip][oracle service][oracle user][oracle password]

该工具显示已删除的注册。远非十全十美,但它确实起到了作用。 java代码与上面描述的@TMtech代码非常相似