Oracle 10g Release2新功能之變化通知
2024-08-29 13:42:01
供稿:網(wǎng)友
引言
在.NET應(yīng)用程序中,我們有很多方法實(shí)現(xiàn)對(duì)Oracle數(shù)據(jù)庫的訪問。 但是從功能和性能上來分析,Oracle Data PRovider for .NET(ODP.NET)無疑是我們最好的選擇,它是Oracle專門為基于.NET的應(yīng)用程序設(shè)計(jì)的一套接口,它的訪問速度要遠(yuǎn)遠(yuǎn)快于其它方法。
本文將介紹Oracle Database的新功能之一:Change Notification。為了能更好的說明這個(gè)新功能,我將用例程的方式來介紹它的定義和使用方法。
Database Change Notification的產(chǎn)生背景
在現(xiàn)在的程序開發(fā)過程中,我們經(jīng)常考慮的一個(gè)提高性能的方法就是用data cache。Data cache 避免了我們每次需要數(shù)據(jù)的時(shí)候都去訪問數(shù)據(jù)庫,這樣節(jié)省了大量的時(shí)間。但是這樣就出現(xiàn)了一個(gè)問題,當(dāng)我們用data cache的時(shí)候,假如在數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生了改變,那么我們data cache 中的數(shù)據(jù)就和數(shù)據(jù)庫的數(shù)據(jù)不一致了,這樣將會(huì)導(dǎo)致錯(cuò)誤。為了解決這個(gè)問題,我們一般常用兩種方法。
1. 讓用戶手動(dòng)的更新data cache的內(nèi)容,例如提供一個(gè)更新按鈕。
2. 讓我們的程序間隔一定的時(shí)間自動(dòng)去更新data cache的內(nèi)容。
不難看出,這兩種方法都有相當(dāng)?shù)木窒扌浴?br />
第一種方法用戶必須記住經(jīng)常的去更新數(shù)據(jù),假如數(shù)據(jù)庫中的數(shù)據(jù)改了但是用戶并沒有去更新數(shù)據(jù),這樣將導(dǎo)致錯(cuò)誤。第二種方法的局限性是我們沒有辦法設(shè)置一個(gè)恰好的時(shí)間間隔使數(shù)據(jù)庫數(shù)據(jù)變化的時(shí)候保證data cache的數(shù)據(jù)也發(fā)生變化。
Database Change Notification就是為了解決這個(gè)難題。
Database Change Notification 的基本概念
Database Change Notification的作用就是當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生變化的時(shí)候,自動(dòng)發(fā)出一個(gè)通知。
用Database Change Notification有三個(gè)步驟:
1. 注冊(cè): 指定數(shù)據(jù)庫要監(jiān)聽的查詢。ODP.NET自動(dòng)注冊(cè)基于這個(gè)查詢的監(jiān)聽事件。數(shù)據(jù)庫可以監(jiān)聽DML(Data Manipulation Language)事件,DDL(Data Definition Language)事件,和global 事件(例如關(guān)閉數(shù)據(jù)庫)。
2. 通知:一旦數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生變化,數(shù)據(jù)庫將自動(dòng)發(fā)出通知,我們要在我們的程序中定義事件處理操作。
3. 響應(yīng):在我們的程序中,一旦收到通知,我們一般情況下會(huì)自動(dòng)更新data cache,當(dāng)然我們可以通知用戶數(shù)據(jù)發(fā)生改變,由他來決定是否進(jìn)行更新。
舉例:
在ODP.NET中使用Database Change Notification很簡(jiǎn)單,請(qǐng)看下面的例程。這個(gè)例程用HR數(shù)據(jù)庫用戶。
static void Main(string[] args)
{
string sql = "select first_name, last_name, salary from employees where employee_id = 149";
string constr = "User Id=hr;PassWord=hr;Data Source=oramag;Pooling=false";
OracleConnection con = new OracleConnection(constr);
con.Open();
OracleCommand cmd = new OracleCommand(sql, con);
OracleDependency dep = new OracleDependency(cmd);
dep.OnChange += new OnChangeEventHandler(OnDatabaseNotification);
cmd.ExecuteNonQuery();
while (notificationReceived == false)
{
Console.WriteLine("Waiting for notification...");
System.Threading.Thread.Sleep(2000);
}
cmd.Dispose();
con.Dispose();
Console.WriteLine("Press ENTER to continue...");
Console.ReadLine();
}
public static void OnDatabaseNotification(object src, OracleNotificationEventArgs args)
{
Console.WriteLine("Database Change Notification received!");
DataTable changeDetails = args.Details;
Console.WriteLine("Resource {0} has changed.", changeDetails.Rows[0]["ResourceName"]);
notificationReceived = true;
}
HR一定要有change notification 權(quán)限,我們用下面的命令。
grant change notification to hr;
在你的電腦上安裝ODP.NET,添加下面的using statement在你的代碼剛開始的地方。
using System.Threading;
using System.Data;
using Oracle.Dataaccess.Client;
現(xiàn)在你就可以運(yùn)行這段例程了。輸出如下:
Waiting for notification...
這個(gè)時(shí)候去修改你的數(shù)據(jù)庫,例如用下面的命令,
update employees set salary = salary+10
where employee_id = 149;
commit;
可以看到有如下的輸出,
Database Change Notification received!
Resource HR.EMPLOYEES has changed.