之前问过DBMS_ALERT在RAC上能不能用,答案是可以的,并且搭建了VMWare测试环境验证了。
然而,当它们是不同的框时,在 SIGNAL() 调用和 WAITONE() 返回之间似乎存在很长的延迟。
我的测试结果与http://vitspinka.blogspot.com/2008/04/dbmsalert-on-rac.html
如果我在 RAC2 框上运行 WAIT 脚本,然后在 RAC1 上运行 SIGNAL,则触发可以在 0.5 到 5 秒后发生。
奇怪的是,如果在 RAC2 上同时运行多个 WAIT 脚本,然后在 RAC1 上发出 SIGNAL 信号,则 WAIT 脚本不会同时触发。它们在 0.5 到 5 秒之间变化。
是否有人知道任何调整参数或 DBMS_ALERT 如何工作的任何细节可以帮助解决这个问题?
我正在使用 Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi。
答案1
问题解决了。
这里有位聪明人注意到,在日志中,等待信号和触发之间的时间总是 5 的倍数。这是因为 DBMS_ALERT.Wait 方法在共享模式(RAC 远程数据库实例就是这样)下使用轮询。虽然 Oracle 文档说轮询时间为 1 秒,但实际上是 5 秒。
使用 DBMS_ALERT.SET_DEFAULT(1) 将时间减少到最多 1 秒。
够好了。