【发布时间】:2009-08-13 03:43:27
【问题描述】:
在我们的项目中,我们想使用Cache Dependency。经过一番搜索,我了解到它仅适用于Sql Server,我们应该为它编写自己的cachedepency类。以前有人尝试过吗?最简单的方法是什么设置对 Oracle 表的依赖关系?我们使用 Oracle 11g 和 .net 2008,感谢您的帮助
【问题讨论】:
在我们的项目中,我们想使用Cache Dependency。经过一番搜索,我了解到它仅适用于Sql Server,我们应该为它编写自己的cachedepency类。以前有人尝试过吗?最简单的方法是什么设置对 Oracle 表的依赖关系?我们使用 Oracle 11g 和 .net 2008,感谢您的帮助
【问题讨论】:
Oracle 允许您使用dbms_alert package 实现通知方案。如果你 google dbms_alert,你会发现很多页面都提供了如何使用它的示例,但基本上它涉及 3 件事:
当您希望客户端收到更改通知时(例如,在需要缓存依赖关系的表的插入/更新/删除触发器中),您调用 dbms_alert.raise(带有您选择的标签) .
客户端将保持一个连接,在该连接处调用了 dbms_alert.register 函数(注册了特定标签)。
客户端可以随时调用dbms_alert.wait或.waitany;该函数将阻塞(或者您可以提供超时),直到发出警报。在您的情况下,您可以在需要显示您正在监控的数据之前立即调用 waitany 并设置一个短暂的超时时间。
等待功能运行良好 - 您不需要不断地轮询,除非您需要知道第二件事发生了变化。相反,您可以在即将使用缓存数据时检查它们以确保其是最新的。此外,在引发它们的事务提交之前,不会通知客户端。
dbms_alert 的最大限制是一次只有一个事务可以引发特定标签的未提交警报。换句话说,如果事务 A 引发警报“foo”,事务 B 在引发“foo”时会阻塞,直到 A 回滚或提交,因此在可能需要很长时间的事务中使用警报通常不是一个好主意(除非阻止其他用户是设计的一部分)。此外,如上所述,客户端需要保持用于检查通知的连接。这可以是您用来执行任何其他数据库活动的同一连接,但如果您正在编写一个执行大量连接池/共享的应用程序,您将需要有一个工具来保持连接保持缓存一致所需的时间长度。
【讨论】: