2013-02-04 2 views
2

C#으로 Oracle 변경 알림을 사용하여 작동하는 테스트 응용 프로그램을 얻으려고하지만 응용 프로그램에 콜백 알림이 수신되지 않습니다. Oracle DB 버전은 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에는 아무 것도 나타나지 않습니다.오라클 변경 알림

등록은 테이블에서 트랜잭션을 커밋 할 때까지 계속됩니다. 커밋 후 몇 초 후에 등록이 사라지고 응용 프로그램이 알림을받지 못합니다.

나는 내 컴퓨터가 올바른 포트에서 수신 대기하는지 확인하고 포트를 차단할 수있는 모든 방화벽을 해제하려고 시도했습니다.

내가 GRANT가 MYSCHEMA에게 DBMS_CHANGE_NOTIFICATION에서 실행, MYSCHEMA에 GRANT 변경 알림을 수행하고 JOB_QUEUE_PROCESSES 1.

질문으로 설정됩니다 등록이 SYS.DBA_CHANGE_NOTIFICATION_REGS에서 볼 수 있어야합니다

1) , 그렇다면 SYS.USER_CHANGE_NOTIFICATION_REGS 및 SYS.USER_CQ_NOTIFICATION_QUERIES에 표시 될 때 발생하지 않는 원인은 무엇입니까?

2) 커밋 후에 등록이 사라질 수있는 원인은 무엇입니까?

3) 내 응용 프로그램에 알림이 실패 할 수있는 원인은 무엇입니까? 여기

은 내가 사용하고 C# 코드이며 기본적으로 오라클 웹 사이트에서와 동일합니다 :

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) 약간 낮다. 오라클은 모든 종류의 유지 보수 및 이벤트 처리 작업을 내부적으로 수행합니다. 이것 때문에 그들은 또한 일 노예를 사용합니다. job_queue_processes (기본값 1000)를 올리고 Troubleshooting CQN Registrations을 입력하십시오.