2013-02-04 132 views
2

我正試圖讓測試應用程序使用Oracle Change Notification與C#一起工作,但我沒有在我的應用程序中收到回調通知。 Oracle數據庫版本是11.2.0.1.0。 Oracle.DataAccess v.2.112.30。我可以通過查看SYS.USER_CHANGE_NOTIFICATION_REGS和SYS.USER_CQ_NOTIFICATION_QUERIES確認查詢在Oracle中註冊。但是,SYS.DBA_CHANGE_NOTIFICATION_REGS中沒有任何內容出現。oracle更改通知

註冊一直存在,直到我在表上提交事務。提交後幾秒鐘後註冊消失,我的應用程序未收到通知。

我確定我的計算機正在偵聽正確的端口,甚至嘗試關閉任何可能阻塞端口的防火牆。

我有GRANT改變通知MYSCHEMA,GRANT EXECUTE ON DBMS_CHANGE_NOTIFICATION TO MYSCHEMA和JOB_QUEUE_PROCESSES設置爲1

問題:

1)應登記在SYS.DBA_CHANGE_NOTIFICATION_REGS是看得見的, ,如果是這樣,當它在SYS.USER_CHANGE_NOTIFICATION_REGS和SYS.USER_CQ_NOTIFICATION_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; 
     } 
    } 
} 

回答

2

只是想提供一個更新,以解決我如何解決此問題。我將我的Oracle.DataAccess.dll從v.2.112.3.0更改爲v.2.112.1.2,它工作正常。

0

不知道,但對JOB_QUEUE_PROCESSES值(1)是有點低。 Oracle在內部執行各種維護和事件處理任務。爲此,他們也使用作業奴隸。提高job_queue_processes(默認1000)並檢查Troubleshooting CQN Registrations