ADO.NET 2.0中的查询通知

概述

任何有实际价值的关系数据库应用程序都离不开一大堆的查询表。如果您是开发图形用户界面的专家,那么您知道这些查询表将用于加工下拉列表框中的列表。我将查询表分成两种:只读表和可改写只读表。二者的区别在于什么会导致表的改变。我认为如果需要召开员工会议或者用户会议才可以修改表的内容,那么表就是只读的。一个好的例子就是公司的产品类别表。表的内容将不会改变直到公司研发并向市场投放了新产品,或者公司进行了重组。可改写的只读表是内容相对固定的列表,但可以被最终用户修改,通常使用组合框而不用下拉列表框来展现。可改写只读表的一个例子就是称谓术语表。应用程序设计人员能够考虑到最常用的那些称谓,如Ms., Mr., Mrs.以及Dr.,但总有某个用户的头衔是您从未考虑过的而且希望把它添加进来。举个例子看看这种情况有多么常见,我最后工作的一个中型产品有一个设计良好符合第三范式的关系数据库,它包含了350—400张表,我估计了一下大约有250张表是只读的或可改写只读表。

传统的Web应用程序(三层结构应用程序的经典范例)希望尽可能地缓存这种类型的表。这样不仅可以减少往返数据库的次数,还可以降低数据库服务器的查询负载、提高某些应用场景的响应能力,例如接受了新订单。只读表很容易缓存;可以始终将表放在缓存中,偶尔需要重新加载表时,则由数据库管理员(DBA)通过某种方式重新加载缓存。我希望您的企业中很少召开对数据库基本结构和内容作修改的会议。重新刷新中间层缓存中可改写只读表则有一点点麻烦。如果缓存刷新的频率太低就无法获得您期望的效果;用户也无法立刻看到其它用户对数据的修改。支持人员可以使用另一个应用程序添加新项,然后给打算使用该项的同伴发送一条即时消息,但同伴的选择列表框中却并不包含新添加的项。更糟糕的是,如果第二个用户此时试图重新添加这条“缺失的列表项”,就会收到一条数据库错误告知该项已经存在了。由于类似问题的存在,如果可改写只读表允许多点更新,那么通常不进行缓存。

过去,程序员不得不自己手工开发解决方案,使用消息队列、进行文件输出的触发器、或者out-of-band协议来通知缓存,如果应用程序外部的某些用户更新了可改写只读表。这种“通知”解决方案只是通知缓存有行被添加或修改了,指示必须刷新缓存。如何通知缓存有哪些行改变了或者有哪些行被添加了,这一直都是个难题,是分布式数据库和分布式事务或者合并复制领域的问题。低成本的通知解决方案的做法是:只要程序收到“缓存无效“的消息就刷新整个缓存。

SqlDependency 提供了缓存解决方案

如果您正在使用SQL Server 2005和ADO.NET 2.0,那么一种新的称为查询通知的通知解决方案已内置在SqlClient数据供应商和数据库中。该问题终于有了内置且易于使用的解决方案!ASP.NET 2.0也内置了用于支持查询通知的特性。ASP.NET的Cache对象可以注册通知,甚至还可以将通知与ASP.NET的页面缓存或页面片段缓存结合在一起使用。

实现该功能的架构中包含了SQL Server 2005查询引擎、SQL Server Service Broker、sp_DispatcherProc系统存储过程,ADO.NET的SqlNotification (System.Data.Sql.SqlNotificationRequest)和SqlDependency类(System.Data.SqlClient.SqlDependency),以及ASP.NET的Cache类(System.Web.Caching.Cache)简而言之,它的工作方式如下:

1.每个ADO.NET SqlCommand都包含一个Notification属性,表示对通知的请求。

当执行SqlCommand时,如果存在Notification属性,那么就会在网络请求中附加一个表示通知请求的网络协议包(TDS)。

2.SQL Server使用查询通知架构注册所请求通知的订阅,然后执行命令。

3.SQL Server“监视”任何可能导致最初返回的结果集发生变化的SQL DML语句。当发生变生时,就向Service Broker服务发送消息。

4.消息可以:

a.引发通知并将通知传回注册的客户端。

b.驻留在Service Broker's的服务队列中,高级客户端可以实现自己的处理机制。

图1. 通知服务概览

时间: 2024-11-03 02:45:17

ADO.NET 2.0中的查询通知的相关文章

ADO.NET 2.0 中的新增 DataSet 功能

ADO.NET 2.0 中的新增 DataSet 功能 发布日期: 1/13/2005 | 更新日期: 1/13/2005 Jackie Goldstein Renaissance Computer Systems 适用于: Microsoft ADO.NET 2.0 Visual Basic 编程语言 摘要:了解有关 .NET Framework DataSet 类以及与它密切相关的类中的新增 ADO.NET 2.0 功能的知识.这些更改包括对 DataSet.DataTable 和 Data

ADO.NET 2.0 中的架构

ado|架构 了解在 ADO.NET 中对于从您的数据源访问元数据的增强支持. 点击此处阅读全文

JPA 2.0中的动态类型安全查询

自从 JPA 于 2006 年首次被引入之后,它就得到了 Java 开发社区的广泛支持.该规范的下一个主要更新 -- 2.0 版本 (JSR 317) -- 将在 2009 年年底完成.JPA 2.0 引入的关键特性之一就是 Criteria API,它为 Java 语言带来了一种独特的能力:开发一种 Java 编译器可以在运行时验证其正确性的查询.Criteria API 还提供一个能够在运行时动态地构建查询的机制. 本文将介绍 Criteria API 和与之密切相关的 元模型(metamo

ASP.NET 2.0 中的异步页功能应用

asp.net|异步 下载本文源代码:WickedCode0510.exe ASP.NET 2.0 提供了大量新功能,其中包括声明性数据绑定和母版页,成员和角色管理服务等.但我认为最棒的功能是异步页,接下来让我告诉您其中的原因. 当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程.一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求.如果一个同步请求成为 I/O 绑定(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用

ASP.NET 2.0 中的异步页[来自MSDN]

ASP.NET 2.0 提供了大量新功能,其中包括声明性数据绑定和母版页,成员和角色管理服务等.但我认为最棒的功能是异步页,接下来让我告诉您其中的原因. 当 ASP.NET 接收针对页的请求时,它从线程池中提取一个线程并将请求分配给该线程.一个普通的(或同步的)页在该请求期间保留线程,从而防止该线程用于处理其他请求.如果一个同步请求成为 I/O 绑定(例如,如果它调用一个远程 Web 服务或查询一个远程数据库,并等待调用返回),那么分配给该请求的线程在调用返回之前处于挂起状态.这影响了可伸缩性,

ASP 3.0中的新特性

    假如读者已经熟悉了ASP 2.0,并正在寻找3.0版本中的实际改变的列表,那么将在下面发现这些信息.假如读者是一个ASP的初学者,可以越过本章到下一章,那里循序渐进地介绍了ASP对象和它们的用法.    ASP 3.0新特性概要    在ASP 3.0中,有一些新的特性或经历较大的变化或改进的特性.    1. 无脚本的ASP    如早先提到的, ASP处理不包括任何脚本的.asp页的速度是很快的,假如你正在创建的站点或Web应用程序文件最终可能使用ASP,最好让这些文件使用.asp文

浅析SQL Server 2005中的主动式通知机制

[导读]本文中,我想通过一个简单的Windows桌面表单示例(基于SQL Server 2005的范例数据库AdventureWorks)向读者展示SQL Server 2005中这种新的主动地通知工作机理.由于Visual Studio 2005的革命性变化,你可以极为容易地把这个例子更改到Web应用程序场合下. 一.引言 在开发多人同时访问的Web应用程序(其实不只这类程序)时,开发人员往往会在缓存策略的设计上狠下功夫.这是因为,如果将这种环境下不常变更的数据临时存放在应用程序服务器或是用户

剖析SQL Server 2005查询通知之基础篇

在本系列文章中,我们将深入探讨如何把.NET 2.0和SQL Server 2005的查询通知特征联合起来,以便通知应用程序何时关键数据发生变化进而达到消除反复查询数据库的目的. 一.引言 数据库应用程序的典型问题之一是更新陈旧的数据. 设想有一个典型的显示产品及其分类的电子商务网站.一个供应商的产品列表很可能并不经常发生变化,而其分类列表甚至更不会频繁更改.然而,在用户每次浏览该网站时,必须从数据库中反复查询这些列表.这显然是一种典型的低效资源利用,开发者和架构师都在绞尽脑汁想办法以减少这种浪

jsp问题-jsp中模糊查询,后台没有出错,为什么实现不了?

问题描述 jsp中模糊查询,后台没有出错,为什么实现不了? 点击查找只是刷新页面,后台没有问题,但是又实现不了 具体代码: <% request.setCharacterEncoding("utf-8"); %> <%! private static final String DBDRIVER ="org.gjt.mm.mysql.Driver"; private static final String DBURL ="jdbc:mysq