程序人生

利用OracleDependency向客户端发出数据库修改通知

时间:2013/9/3 11:48:47  作者:说歌社区  来源:www.solgle.com  查看:2447  评论:0
内容摘要:OracleDependency所在程序集:Oracle.DataAccess.dll,注意在安装目录下的ODP.NET\bin\2.x目录中可以找到Oracle.DataAccess.dll文件引言  在.NET应用程序中,我们有很多方法实现对Oracle数据库的访问。但是从功...

OracleDependency所在程序集:Oracle.DataAccess.dll,注意在安装目录下的

ODP.NET\bin\2.x目录中可以找到Oracle.DataAccess.dll文件

引言

  在.NET应用程序中,我们有很多方法实现对Oracle数据库的访问。但是从功能和性能上来分析,Oracle Data Provider for .NET(ODP.NET)无疑是我们最好的选择,它是Oracle专门为基于.NET的应用程序设计的一套接口,它的访问速度要远远快于其它方法。

  本文将介绍Oracle Database的新功能之一:Change Notification。为了能更好的说明这个新功能,我将用例程的方式来介绍它的定义和使用方法。

  Database Change Notification的产生背景

  在现在的程序开发过程中,我们经常考虑的一个提高性能的方法就是用data cache。Data cache 避免了我们每次需要数据的时候都去访问数据库,这样节省了大量的时间。但是这样就出现了一个问题,当我们用data cache的时候,如果在数据库中的数据发生了改变,那么我们data cache 中的数据就和数据库的数据不一致了,这样将会导致错误。为了解决这个问题,我们一般常用两种方法。

  1. 让用户手动的更新data cache的内容,例如提供一个更新按钮。

  2. 让我们的程序间隔一定的时间自动去更新data cache的内容。

  不难看出,这两种方法都有相当的局限性。

  第一种方法用户必须记住经常的去更新数据,如果数据库中的数据改了但是用户并没有去更新数据,这样将导致错误。第二种方法的局限性是我们没有办法设置一个恰好的时间间隔使数据库数据变化的时候保证data cache的数据也发生变化。

  Database Change Notification就是为了解决这个难题。

  Database Change Notification 的基本概念

  Database Change Notification的作用就是当数据库中的数据发生变化的时候,自动发出一个通知。

  用Database Change Notification有三个步骤:

  1. 注册:指定数据库要监听的查询。ODP.NET自动注册基于这个查询的监听事件。数据库可以监听DML(Data Manipulation Language)事件,DDL(Data Definition Language)事件,和global 事件(例如关闭数据库)。

  2. 通知:一旦数据库中的数据发生变化,数据库将自动发出通知,我们要在我们的程序中定义事件处理操作。

  3. 响应:在我们的程序中,一旦收到通知,我们一般情况下会自动更新data cache,当然我们可以通知用户数据发生改变,由他来决定是否进行更新。

  举例:

  在ODP.NET中使用Database Change Notification很简单,请看下面的例程。这个例程用HR数据库用户。

 

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 权限,我们用下面的命令。

 

grant change notification to hr;

 

  在你的电脑上安装ODP.NET,添加下面的using statement在你的代码刚开始的地方。

 

using System.Threading;

 

using System.Data;

using Oracle.DataAccess.Client;

 

  现在你就可以运行这段例程了。输出如下:

 

Waiting for notification...

 

  这个时候去修改你的数据库,例如用下面的命令,

 

update employees set salary = salary+10

 

where employee_id = 149;

commit;

 

  可以看到有如下的输出,

 

Database Change Notification received!

 

Resource HR.EMPLOYEES has changed.


在使用OracleDependency时要注意以下几个问题。
0.OracleDependency能检测什么?
数据或者数据库状态。
1。为什么有时候能收到服务器的通知,有时候就不能了呢?
这是因为你生成一个OracleDependency的对象时,没有保存它。如果它只是一个局部变量,就会被垃圾回收,而回收的时间是不固定的。一旦被垃圾回收就不能接收到通知了。
2.注册了一个OracleDependency,一定要取消注册吗?
是的,要是你不取消,就会一直发消息过来,即使你的OracleDependency对象析构了,也不能取消在数据库服务器端的注册。这个对数据库服务器的影响很大。
3.怎样取消OracleDependency注册?
当你初始化时,就有几个参数,一个是是否只监听一次改变,如果这个值你设的是true,那么在收到一个事件通知时,数据库端就会自动取消这个注册。还有一个初始化的参数是设置注册有效的时间。当时间到了,数据库服务器也会取消注册。如果你在初始化时,选择监听多次,并且把时间设置为0(永久有效)那么你就必须在你的程序里显式调用RemoveDependency()这个函数来取消注册。
4.什么时候用OracleDependency?
关心的数据库状态的变化不太频繁时。

 
标签:利用OracleDependency向客户端发出数据库修改通知 

solgle.com 版权所有,欢迎分享!!!

相关文章
    相关评论
     img1 img2 img3 img4 img5 img6 img7 img8 img9 img10
    评论者:      验证码:  点击获取验证码
       Copyright © 2013-2028 solgle.com,All rights reserved.[solgle.com] 公安机关备案号:51010802000219
    Email:solgle@solgle.com; weixin:cd1008610000 ICP:蜀ICP备14011070号-1