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;
}
}
}