热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

分析SQLServer2005查询通知之基础篇

在本系列文章中,我们将深进探讨如何把.NET2.0和SQLServer2005的查询通知特点联合起来,以便通知利用程序何时要害数据产生变更进而达到打消重复查询数据库的目标。一、引言数据库

在本系列文章中,我们将深进探讨如何把.NET 2.0和SQL Server 2005的查询通知特点联合起来,以便通知利用程序何时要害数据产生变更进而达到打消重复查询数据库的目标。

一、引言

数据库利用程序的典范标题之一是更新陈腐的数据。

假想有一个典范的显示产品及其分类的电子商务网站。一个供应商的产品列表很可能并不经常产生变更,而其分类列表甚至更不会频繁更改。然而,在用户每次浏览该网站时,必需从数据库中重复查询这些列表。这显然是一种典范的低效资源利用,开发者和架构师都在绞尽脑汁想措施以减少这种浪费。

缓冲技巧正是“最小化”对这种几乎“停止”的数据进行重复查询的技巧之一。这种数据可以被进行一次性查询并存储在一个缓冲区中,而且利用程序可以从缓存中重复地存取数据。偶然情况下,才更新缓存以得到新数据。但是,缭绕更新缓存的时间调度方面呈现了几个标题。该多长时间把持一次呢?例如,你每隔多长时间盼看你的产品分类转变一次?每隔几个月一次?每隔两个月刷新一次该缓冲区如何?你知道会产生什么吗?就在你刷新缓存之后,分类被更新,而且在下一次刷新前在两个月的时间里它将保持陈腐。

查询通知,是微软的ADO.NET和SQL Server小组协作开发的新成果。简言之,查询通知答应你缓冲数据并且仅在SQL Server中的数据产生变更时才发出通知。一旦接到通知,你就可以刷新你的缓冲区或者采用你需要的任何措施。

在SQL Server 2005中引进的一种新特点“Service Broker”使得查询通知成为可能。Service Broker把队列机制引进到数据库治理中,它应用一组队列与服务进行通信,而服务反过来也知道如何往回通信以调用相应的实体。实在,这些队列和服务都是一些与表、视图和存储过程一样的类对象。尽管完整可以在SQL Server内应用Service Broker,但是ADO.NET知道如何与Service Broker进行通信以触发这种机制并且从Service Broker中检索回通知。

留心 当SQL Server中的数据产生转变时,查询通知答应你缓冲数据并且通知你。

在.NET一端,存在很多种“钩进”这种功效的方法。ADO.NET 2.0供给了System.Data.SqlClient.SqlDependency和System.Data.Sql.SqlNotificationRequest类。SqlDependency是SqlNotificationRequest的一种高级实现,并且是当应用ADO.NET 2.0时你最有可能应用的类。ASP.NET 2.0也通过System.Web.Caching.SqlCache-Dependency类(它供给了一个针对SqlDependency的包装器)与Service Broker进行通信,而且这是直接通过在一个ASP.NET页面中应用<%OutputCache>指令以声明方法供给的功效实现的。这答应ASP.NET开发者轻易地实现使依附于SQL Server中的数据中的缓存无效。

二、.NET与Service Broker的通信

上面这些技巧是如何联合到一起来解决“缓冲之谜”的呢?尽管你可以采用很多的措施以答应SQL Server把服务供给应.NET;但是,要害还在于,发送到SQL Server的查询具有一个依附到它们的标记以便告诉SQL Server,除了返回成果集外,SQL Server还应当把该查询(及其恳求者)注册到Service Broker。为此,你要创立一个感知该查询的队列和一个依附到该队列的服务,并且知道如何返回到客户端。假如该成果集中的任何一行在数据库中得到更新,那么在相干队列中的项将触发,并且反过来,把一条消息发送到它的服务,然后把一个通知发送回初始化该恳求的利用程序。

图1是SQL Server Management Studio的一个快照,它显示了在数据库的Service Broker部分中的队列(Queues)和服务(Services)。

图1.该图显示了.NET的查询通知所应用的Pubs数据库中的缺省队列和服务。

下面是懂得这一过程的一些有关重要内容:

· 存在一些规矩以指出SQL Server接收哪些类型的查询。

· 一旦SQL Server发送回通知,队列和服务即被删除。这意味着,你仅能在每次恳求中得到一个通知。一个典范的利用程序会重新查询数据库并且,在同时,恳求在Service Broker中创立一种新的依附性。

· 返回到利用程序的信息也不过是“something changed”。该利用程序并不被通知转变了什么(请参考本文中的SQLNotificationEventArgs
节懂得更多的信息)。

· 尽管依附性被绑定到从查询中返回的行上;但是,它并不被查询中的单个列加以过滤。假如你有一个查询—它返回你的组织的基础成员姓名以及那些单个转变之一的地址(但是,其姓名并不转变),这将触发一个转变通知。很盼看,这种特别行动在未来的版本中会有所转变。

· 通知被返回,通过一个专门针对这一目标建立的SqlConnection。这个连接并不参加连接池中。

三、何时应用查询通知

查询通知是针对于并不经常转变的数据而设计的。最好把它利用于服务器真个利用程序(例如ASP.NET或remoting)而不是客户端利用程序(例如Windows表单利用程序)。记住,每一个通知恳求都要在SQL Server中注册。假如你拥有大批的都有通知恳求的客户端利用程序,那么这可能会导致你的服务器产生资源标题。微软推荐,对于客户端利用程序,你应当限制查询通知应用为未几于十个并行用户。

对于大范围利用程序来说,查询通知可能是一种强有力的帮助,而不用简略地添加越来越多的服务器以满足请求。假想,有一家大型的为成千上百万用户供给在线软件更新服务的软件公司。不是使每一个用户的更新把持都触发服务器上的另一个查询来断定需要哪些组件,而是能够缓冲查询成果并且可以直接从该缓存中服务匹配的查询。

留心:对于客户端利用程序来说,应当限制你的查询通知应用—未几于十个并发用户。

对于较小范围的情况而言,下拉式列表框是另一种典范的数据集;此时该数据集更新的次数并不如恳求的次数多。产品列表、州列表、国家列表、供应商、销售人,甚至更多不太需要频繁转变的信息正是应用通知的较好候选。

四、为应用查询通知作准备

由于默认情况下SQL Server 2005处于高度安全的状态,所以你需要“打开”一些功效才干应用查询通知。首先,你要应用的每一个数据库都需要启动Service Broker功效。为此,你可以在T-SQL中应用如下命令实现:

USE mydatabase

ALTER DATABASE mydb SET ENABLE_BROKER

另外,你需要授予一些SQL Server权限以答应非治理员帐户能够参与应用查询通知。

五、SqlDependency.Start和Stop

SqlDependency和SqlCacheDependency都请求,在任何通知恳求前先调用静态方法SqlDependency.Start()。这个方法负责创立一个SqlConnection以实现在数据转变时接收通知。留心,你仅需要在一个利用程序的生命周期的开端建立这些内容。例如,在一个ASP.NET利用程序中,global.asax文件的Application_Start事件处理器就是实现这一功效的利益所。

留心,对包含在通知中的每一个连接都应当调用Start方法。因此,假如你在利用程序中存取多个数据库,那么你需要为每一个数据库调用Start。在下列示例中,有一个针对Pubs数据库的连接串pubsConn,它在这个利用程序的web.config文件中定义。

为了切断这个连接,你可以应用SqlDependency.Stop(),这也是一个静态方法。

推荐阅读
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • 本文探讨了使用Python实现监控信息收集的方法,涵盖从基础的日志记录到复杂的系统运维解决方案,旨在帮助开发者和运维人员提升工作效率。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • JavaScript 中引号的多层嵌套使用技巧
    本文详细介绍了在 JavaScript 编程中如何处理引号的多级嵌套问题,包括双引号、单引号以及转义字符的正确使用方法。 ... [详细]
  • 解决UIScrollView自动偏移问题的方法
    本文介绍了一种有效的方法来解决在使用UIScrollView时出现的自动向下偏移的问题,通过调整特定的属性设置,可以确保滚动视图正常显示。 ... [详细]
  • 如何高效渲染JSON数据
    本文介绍了在控制器中返回JSON结果的方法,并详细说明了如何利用jQuery处理和展示这些数据,为Web开发提供了实用的技巧。 ... [详细]
  • Awk是一款功能强大的文本分析与处理工具,尤其在数据解析和报告生成方面表现突出。它通过读取由换行符分隔的记录,并按照指定的字段分隔符来划分和处理这些记录,从而实现复杂的数据操作。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 本文探讨了一种常见的C++面试题目——实现自己的String类。通过此过程,不仅能够检验开发者对C++基础知识的掌握程度,还能加深对其高级特性的理解。文章详细介绍了如何实现基本的功能,如构造函数、析构函数、拷贝构造函数及赋值运算符重载等。 ... [详细]
author-avatar
278787061w
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有