国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

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.

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 小金县| 平邑县| 山东省| 洛扎县| 澄江县| 长丰县| 察隅县| 昭觉县| 汨罗市| 大埔县| 惠水县| 柳江县| 会昌县| 保定市| 西丰县| 凤山市| 手机| 高密市| 佛教| 松阳县| 罗定市| 长宁县| 敦煌市| 定兴县| 芜湖县| 丹阳市| 舞阳县| 湖州市| 出国| 丰都县| 寿光市| 三河市| 洪雅县| 新巴尔虎右旗| 东源县| 丰县| 淮安市| 通榆县| 阜新| 民乐县| 甘肃省|