引言
在NET應用程序中我們有很多方法實現對Oracle數據庫的訪問 但是從功能和性能上來分析Oracle Data Provider for NET(ODPNET)無疑是我們最好的選擇它是Oracle專門為基於NET的應用程序設計的一套接口它的訪問速度要遠遠快於其它方法
本文將介紹Oracle Database的新功能之一Change Notification為了能更好的說明這個新功能我將用例程的方式來介紹它的定義和使用方法
Database Change Notification的產生背景
在現在的程序開發過程中我們經常考慮的一個提高性能的方法就是用data cacheData cache 避免了我們每次需要數據的時候都去訪問數據庫這樣節省了大量的時間但是這樣就出現了一個問題當我們用data cache的時候如果在數據庫中的數據發生了改變那麼我們data cache 中的數據就和數據庫的數據不一致了這樣將會導致錯誤為了解決這個問題我們一般常用兩種方法
讓用戶手動的更新data cache的內容例如提供一個更新按鈕
讓我們的程序間隔一定的時間自動去更新data cache的內容
不難看出這兩種方法都有相當的局限性
第一種方法用戶必須記住經常的去更新數據如果數據庫中的數據改了但是用戶並沒有去更新數據這樣將導致錯誤第二種方法的局限性是我們沒有辦法設置一個恰好的時間間隔使數據庫數據變化的時候保證data cache的數據也發生變化
Database Change Notification就是為了解決這個難題
Database Change Notification 的基本概念
Database Change Notification的作用就是當數據庫中的數據發生變化的時候自動發出一個通知
用Database Change Notification有三個步驟
注冊 指定數據庫要監聽的查詢ODPNET自動注冊基於這個查詢的監聽事件數據庫可以監聽DML(Data Manipulation Language)事件DDL(Data Definition Language)事件和global 事件(例如關閉數據庫)
通知一旦數據庫中的數據發生變化數據庫將自動發出通知我們要在我們的程序中定義事件處理操作
響應在我們的程序中一旦收到通知我們一般情況下會自動更新data cache當然我們可以通知用戶數據發生改變由他來決定是否進行更新
舉例
在ODPNET中使用Database Change Notification很簡單請看下面的例程這個例程用HR數據庫用戶
static void Main(string[] args)
{
string sql = select first_name last_name salary from employees where employee_id = ;
string constr = User Id=hr;Password=hr;Data Source=oramag;Pooling=false;
OracleConnection con = new OracleConnection(constr);
conOpen();
OracleCommand cmd = new OracleCommand(sql con);
OracleDependency dep = new OracleDependency(cmd);
depOnChange += new OnChangeEventHandler(OnDatabaseNotification);
cmdExecuteNonQuery();
while (notificationReceived == false)
{
ConsoleWriteLine(Waiting for notification);
SystemThreadingThreadSleep();
}
cmdDispose();
conDispose();
ConsoleWriteLine(Press ENTER to continue);
ConsoleReadLine();
}
public static void OnDatabaseNotification(object src OracleNotificationEventArgs args)
{
ConsoleWriteLine(Database Change Notification received!);
DataTable changeDetails = argsDetails;
ConsoleWriteLine(Resource {} has changed changeDetailsRows[][ResourceName]);
notificationReceived = true;
}
HR一定要有change notification 權限我們用下面的命令
grant change notification to hr;
在你的電腦上安裝ODPNET添加下面的using statement在你的代碼剛開始的地方
using SystemThreading;
using SystemData;
using OracleDataAccessClient;
現在你就可以運行這段例程了輸出如下
Waiting for notification
這個時候去修改你的數據庫例如用下面的命令
update employees set salary = salary+
where employee_id = ;
commit;
可以看到有如下的輸出
Database Change Notification received!
Resource HREMPLOYEES has changed
From:http://tw.wingwit.com/Article/program/Oracle/201311/18853.html