oracle更改通知

本文关键字:通知 oracle | 更新日期: 2023-09-27 17:57:28

我正试图让一个测试应用程序使用C#的Oracle更改通知来工作,但我的应用程序中没有收到回调通知。Oracle数据库版本为11.2.0.1.0。Oracle.DataAccess第2.112.30版。我可以通过查看SYS.USER_CHANGE_NOTIFICATION_REQUERIES和SYS.USER_CQ_NOTIFIATION_QUERIES来确认查询已在Oracle中注册。但是,SYS.DBA_CHANGE_NOTIFICATION _REGS中从未出现任何内容。

注册一直持续到我在表上提交事务为止。提交后几秒钟,注册就消失了,我的应用程序也没有收到通知。

我已经确保我的计算机在正确的端口上侦听,甚至尝试关闭任何可能阻塞端口的防火墙。

我确实有对MYSCHEMA的GRANT CHANGE NOTIFICATION,对DBMS_CHANGE_NOTIFICATION的GRANT EXECUTE,并且JOB_QUEUE_PROCESSES设置为1。

问题:

1) 该注册是否应在SYS.DBA_CHANGE_NOTIFICATION_REQS中可见?如果是,当它在SYS.USER_CHANGE-NOTIFICATION _REGS和SYST.USER_CQ_NOTIFIATION_QUERIES中可见时,是什么原因导致它不可见?

2) 是什么原因导致注册在提交后消失?

3) 是什么原因导致我的应用程序通知失败?

这是我正在使用的C#代码,它基本上与Oracle网站上的代码相同:

using System;
using System.Threading;
using System.Data;
using Oracle.DataAccess.Client;
namespace NotifyTest
{
    public class Program
    {
        public static bool IsNotified = false;
            public static void Main(string[] args)
        {
            string constr = "User Id=mySchema;Password=myPassword;Data Source=myOracleInstance";
            OracleDependency dep = null;
            try
            {
                using (var con = new OracleConnection(constr))
                {
                    Console.WriteLine("Registering query...");
                    var cmd = new OracleCommand("select * from mySchema.NOTIFY_TEST", con);
                    con.Open();
                    OracleDependency.Port = 1005;
                    dep = new OracleDependency(cmd);
                    dep.OnChange += OnMyNotificaton;
                    int queryRegistered = cmd.ExecuteNonQuery();
                    // If oracle returns -1, then the query is successfully registered
                    if (queryRegistered == -1)
                    {
                        Console.WriteLine("Query Registered...");
                        Console.WriteLine("Listening for Callback...");
                    }
                    else
                    {
                        Console.WriteLine("There was an error...");
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            // Loop while waiting for notification       
            while (IsNotified == false)
            {
                Thread.Sleep(100);
            }
        }
        public static void OnMyNotificaton(object sender, OracleNotificationEventArgs arg)
        {
            Console.WriteLine("Table change notification event is raised");
            Console.WriteLine(arg.Source.ToString());
            Console.WriteLine(arg.Info.ToString());
            Console.WriteLine(arg.Source.ToString());
            Console.WriteLine(arg.Type.ToString());
            IsNotified = true;
        }
    }
}

oracle更改通知

我只是想提供一个关于我如何解决这个问题的更新。我将Oracle.DataAccess.dll从v.2.11.3.0更改为v.2.1112.1.2,它运行良好。

在SYS.CHNF$_REG_INFO属性QOSFLAGS中有QOS_DEREG_NFY,它指定数据库应在第一次通知时注销注册。

不确定,但job_queue_processes(1)的值有点低。Oracle在内部执行各种维护和事件处理任务。为此,他们还使用了工作奴隶。引发job_queue_processes(默认值1000)并选中Troubleshooting CQN Registrations