数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

Oracle10gRelease2新功能之变化通知


发布日期:2021年06月12日
 
Oracle10gRelease2新功能之变化通知

引言

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

               

上一篇:oracle的netconfigureassistant使用过程

下一篇:Oracle webserver中文介绍-第一章