3

这个主题与 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(string guid) 所以在我创建 oracle 依赖项后,我保存了他的 ID(似乎是它的 guid)。当我的应用程序停止时,我可以使用此方法来获取我的依赖项。不幸的是,应用程序重新启动后它没有工作:/如果我尝试通过这个 Id 获取 OracleDependency 它返回 null 但它仍然存在于 USER_CHANGE_NOTIFICATION_REGS

4

3 回答 3

2

虽然这是一个相当古老的问题,但我将描述我对 Oracle CQN 的体验,以防万一它对某人有所帮助。该功能在 java 中效果更好,不仅可以轻松注册,还可以取消注册通知。在 .NET 中,如果应用程序崩溃,根据我的经验,无法使用代码取消注册通知。撤销更改通知不会立即生效。直到数据库重新启动,注册才被撤销。当与通知接收者的通信出现问题时,Oracle 似乎删除了注册。我能够使用这种行为取消注册通知。例如通过打开防火墙!我用来为特定 oracle 用户取消注册通知的另一个解决方案是我在 java 中编写的一个名为 NotificationRegistrationsCleaner.jar 的工具。可以从以下链接下载。我们称它为传递 4 个参数,就像这样。

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

该工具显示已删除的注册。远非完美,但它正在完成这项工作。java 代码与上面描述的@TMtech 代码非常相似。

NotificationRegistrationsCleaner.jar

于 2018-07-16T18:29:39.177 回答
2

用于从数据库中删除所有更改通知注册的 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

于 2016-06-23T10:06:34.770 回答
0

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

于 2015-10-14T11:47:05.803 回答