我正試圖讓測試應用程序使用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;
}
}
}