这个主题与 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