admin 管理员组

文章数量: 1184232


2024年4月17日发(作者:regression修辞手法)

第19卷 

第21期 

Vo1.19 

No.21 

电子设计工程 

Electronic Design Engineering 

2011年11月 

NOV.2011 

使用MSMQ实现SQL SERVER的推送服务 

翟乃强 

(青岛远洋船员学院现代教育技术中心,山东青岛266071) 

摘要:在传统的应用中,客户端从数据库拉取数据。在实时性较强,数据更新周期较长的应用中,一般采用短时间间 

隔的轮询方式.增加了数据库端的负担。利用数据库的触发器调用CLR存储过程或者扩展存储过程,配合MSMQ的 

消息传递能力.可以实现数据库推送数据的服务。 

关键词:数据库;推送服务;存储过程;消息队列;触发器 

中图分类号:1]P.391 文献标识码:A 文章编号:1674—6236(2011)21—0050—03 

Implementation of SQL SERVER push service by siung MSMQ 

ZHAI Nai—qiang 

(Modern Education Technical Center,Qingdao Ocean ShippingMariners College,Qingdao 266071,China) 

Abstract:In traditional applications,clients pull data from a database.In a application that need a real-time processing and 

the database update cycle is a very long time,generally a short interval of polling which increase the burden on the database 

side is used.Using database tirggers,CLR stored procedure or extended stored procedure,with the MSMQ messaging 

capabilities,a database push data service is implemented. 

Key words:database;push service;stored procedure;message queue;trigger 

数据库在现代信息技术里面具有重要的地位,多数的的 

应用系统都是以数据库为中心进行开发的。在数据库的相关 

操作中,数据的查询在应用中占有很大的部分,而查询均是 

证的复杂的参照完整性和数据的一致性。除此之外,触发器 

还有其他许多不同的功能: 

1)强化约束(Enforce restriction) 

数据拉取的方式,即客户端提交请求,数据库端进行相关的 

操作并返回数据。在这种方式下,应用程序仅在有需要的时 

触发器能够实现比CHECK语句更为复杂的约束。 

2)跟踪变化Audiitng changes 

候才向数据库提交请求,并获取数据。在某些特殊的多用户 

情况下,数据库中的数据不定时产生的变化需要实时的体现 

‘ 触发器可以侦测数据库内的操作,从而不允许数据库中 

未经许可的指定更新和变化。 

在客户端时,常采用轮询的方式,可以根据需要处理事件的 

优先级或者实时性要求,设定查询频率,定时去数据库端拉 

取数据。当数据的处理实时性要求较高而数据库端产生数据 

变化的时间间隔较长的时候,就需要客户端频繁地去数据库 

端拉取数据,此时单位时间内将产生大量的拉取数据的请 

求,这些请求绝大部分是无效的而又不得不去做的,这些请

求将增大数据库端的负担和网络带宽的占用。针对这种情 

3)级联运行(Cascaded operation)。 

触发器可以侦测数据库内的操作,并自动地级联影响整 

个数据库的各项内容。例如,某个表上的触发器中包含有对 

另外一个表的数据操作(如删除,更新,插入)而该操作又导 

致该表上触发器被触发。 

4)存储过程的调用(Stored procedure invocation)。 

为了响应数据库更新,触发器可以调用一个或多个存储 

况,提出了一种使用MSMQ和触发器机制实现的数据库的推 

送服务,其本质是数据库端产生了数据变化,将对订阅了此 

过程,甚至可以通过外部过程的调用而在DBMS(数据库管 

理系统)本身之外进行操作。 

变化的客户端程序发送一个可查询的信息,然后等待客户端 

的查询。 

触发器一般情况下分为3种:BEFORE,AFIER和 

INSTEAD OF,分别用于在异动发生前执行、异动发生后执行 

1触发器 

触发器是用户预定义的一类由事件驱动的特殊存储过 

羹萎 

建立方式如下: 

兰 

程。当进行插入、删除、更新等操作时,触发器会自动执行【1]。 

触发器的主要作用就是其能够实现由主键和外键所不能保 

收稿日期:2011-09—06 稿件编号:201109034 

CREATE TRIGGER eventl 

ON tblae 

AFTER INSERT 

作者简介:翟乃强(1977一),男,山东淄博人,硕士,讲师。研究方向:通信技术、图像处理、模式识别。 

50- 

翟乃强 使用MSMQ实现SQL SERVER的推送服务 

AS 

5)使用DROP ASSEMBLY删除存储过程。 

通过在触发器中运行建立的CLR存储过程或者扩展存 

储过程,可以实现外部的消息发送。由于客户端程序的分布 

EXEC someproc 

因为触发器是事件驱动的,能够实时地获得数据改变的 

情况,因此可以作为数据库推送服务的发动者剐。各应用程 

序通过在数据库中建立相应的触发器来订阅所关注的数据 

式,消息的安全性、事务性等要求,考虑使用MSMQ作为消息 

的中转方式。 

变化情况。对于多个应用程序关注相同事件的情形下.只需 

要建立一个触发器。 

3 MSMQ 

MSMQ(Microsoft Message Queuing Server,消息队列)是一 

种消息处理基础结构和开发工具。用于在Microsoft Windows 

2 CLR存储过程和扩展存储过程 

存储过程(Stored Procedure)是一组为了完成特定功能的 

操作系统中创建分布式消息处理程序[61。为消息队列开发的 

SQL语句集,是利用SQL Server所提供的Transact—SQL语言 

所编写的程序。功能是将常用或复杂的工作,预先用SQL语 

句写好并用一个指定名称存储起来。以后需要数据库提供与 

已定义好的存储过程的功能相同的服务时.只需调用此存储 

过程即可自动完成命令。存储过程经编译和优化后存储在数 

据库服务器中.可由应用程序通过一个调用来执行.而且允 

许用户声明变量。同时,存储过程可以接收和输出参数、返回 

执行存储过程的状态值,也可以嵌套调用。 

存储过程分为系统存储过程、本地存储过程、临时存储 

过程和扩展存储过程等。其中扩展存储过程(Extended Stored 

Procedures)是用户可以使用外部程序语言编写的存储过程. 

具有较强的灵活性。在SQL Server中扩展存储过程又分为普 

通扩展存储过程和基于CLR的扩展存储过程。 

触发器建立后需要将此事件发送到数据库外部.而不是 

简单的执行部分DDL或者DML操作,因此需要数据库运行 

扩展存储过程或者CLR存储过程。 

扩展存储过程是SQL Server实例可以动态加载和运行 

的DLL。扩展存储过程是使用SQL Server扩展存储过程 

API编写的,可直接在SQL Server实例的地址空间中运行。 

扩展存储过程的显示方式和执行方式与常规存储过程一样。 

可以将参数传递给扩展存储过程,而且扩展存储过程也可以 

返回结果和状态。在SQL SERVER中可以使用Transact-SQL 

语句sp_addextendedproe来调用扩展存储过程。由于扩展存 

储过程可能会产生内存泄漏或其他降低服务器的性能及可 

靠性的问题,在SQL SERVER 2008以后的版本中将不提供 

支持H。 

CLR存储过程使得可以在SQL Server实例中创建在 

Microsoft.NET Framework公共语言运行时(CLR)中创建的 

程序集中进行编程的数据库对象。能够利用由CLR提供的 

众多编程模型的数据库对象包括触发器、存储过程、函数、聚 

合函数和类型等四。在SQL SERVER中使用CLR存储过程的 

基本步骤是: 

1)使用.NET Framework开发环境开发建立程序集。 

2)使用Transact-SQL语句sp_configure启用SQL Sevrer 

中的CLR运行环境。 

3)使用CREATE ASSEMBLY加载程序集。 

4)使用CREATE PROCEDURE调用存储过程。 

应用程序向队列发送消息,当条件允许时这些消息会继续传 

送到最终目标。应用程序可以在异类网络的环境中进行通 

信,并能在会偶尔无法连通的计算机之间发送消息。消息队 

列提供了可靠的消息传递、高效的路由、安全性和基于优先 

级的消息处理。并支持在事务内发送消息。消息队列可以灵 

活的运行于单台计算机。工作组中或者是域中,也可以通过 

MQC等其他软件在其他系统如UNIX中运行消息队列。也可 

以与其他类型的消息队列进行无缝对接册。 

客户端订阅的数据库数据变化信息,也应该对应的在 

MSMQ中建立队列。MSMQ队列可以存在于服务器端也可以 

存在于客户端。如果客户机与数据库在同一个子网中,并且 

不考虑加密及异构系统中的消息传递等,可以考虑单机或者 

工作组中的消息队列形式.否则就需要配置存在于域中的消 

息服务器。 

MSMQ中的每一个队列都支持消息队列触发器。在这些 

触发器中可以定义触发规则,当队列中消息变化时调用COM 

组件或者可执行程序,用这种方式可实现通知等待消息的客 

户端程序。事实上,每一个消息队列都支持异步读取消息的 

方法,当没有新的消息到来时,读取的线程将被阻塞。可以通 

过这种方式等待事件的发生.而不使用消息队列的触发器。 

如图1所示。 

MSMQ 

客 异步请求一 队列1 

端 

户 看数据则返回 

队列n 

图1客户端通过异步请求访问消息队列 

Fig.1 Client access to a message queue asynchronously 

4整合 

实现SQL SERVER半推送式的服务。需要进行四部分的 

工作: 

1)在.NET Framework开发环境中开发基于CLR的存储 

过程,用于向MSMQ发送消息。 

2)根据客户端程序的需要在数据库中建立调用第(1)步 

存储过程的触发器。 

3)MSMQ服务器中建立对应的队列,根据应用需求的安 

51— 

《电子设计工程)2011年第21期 

全性等因素可以使用事务性队列。 

4)客户端程序访问MSMQ服务器预定义的队列。队列如 

果针对于单个客户端。则使异步的Receive方法读取,此方法 

YAO Yu-chun,PAN Lin・sen,WANG Fan.Database triggers 

and their印plication[J].Journal of Chongqing Jianzhu 

University,2003,25(5):128-129. 

读取完毕将从队列中删除此消息。如果针对于多个客户端, 

则需要建立消息队列时要PEEK方法读取,由各客户端相互 

协调消息的读取删除等操作嘲。 

【2】黄晓涛.数据库触发器实现数据库系统的主动功fiE[J].计 

算机应用研究,1999,9(47):47-48. 

HUANG Xiao・tao.Implementation of active ̄ature by 

整个SQL SERVER的半推送服务的方式如图2所示。 

database tirgger[J】.Application Research Of Computers, 

1999,9(47):47-48. 

[3】张文超,张臻,李军怀.基于触发器机制的主动数据库模 

型研究[J].计算机应用,2006,26(10):2418—2419. 

ZHANG Wen-chao,ZHANG Jing,LI Jun-huai.New model of 

n aactive database based on triggers ComputerApp lications, 

20o6.26(10):2418—2419. 

图2半推送式服务的实现 

Fig.2 Implementation of semi-push service 

[4】扩展存储过程【EB/OL].[2Ol 1—09—o6】I http://teehnet.microsoft. 

com/zh—cn/library/ms175200.aspx. 

5结束语 . 

被动式提供服务的数据库系统。利用CLR或扩展存储过 

【5】CLR存储过程【EB/OL]. ̄011-09_o6].http://technet.microsoft. 

com/zh—cn/library/ms190790.aspx 

【6】王松磊,陈永生.基于消息队列的独立通信层的设计与应 

程与MSMQ服务一起可以提供主动的数据推送服务。在某些 

实时性要求高且数据变化周期长的情形下能够提高效率。降 

低数据库服务端的负担和网络压力。本文提出的推送方式是 

由数据库通过消息通知客户端来进行查询。可以称之为半推 

送的服务方式。如果客户端对于数据变化需求确定,可以通 

过存储过程将需要的数据经MSMQ序列直接发送到客户端. 

这样也就完成了数据库的完全推送服务。 

参考文献: 

用[J】.计算机应用,2010,30(2):21—22. 

WANG Song—lei,CHEN Yong—sheng.Design and application 

independent of communication layer based on message 

queu ̄.Journal ofComputerApp licafions,2010,30(2) ̄1-2Z 

【7】使用消息队列 B L].[201 1-09-06].httpJ/teehnet.microsoft. 

com/zh-cn/library/cc739189(WS.1O).spx.a 

【8】Send MSMQ Messages Securely Across the Internet with 

HTrP nd aSOAP B/O [2Ol 1--09_0嘲.http'Jhnsdn.microsoft. 

com/zh—cn/magazine/cc164041(en-us).spx.a 

【1】姚渝眷,潘林森,王凡.数据库触发器及应用【J].重庆建筑 

大学学报,2003,25(5):128—129. 

(上接第49页) 

swarm optimization[M].New York:Evolutionary Programming, 

1998. 

Piscataway,NJ:IEEE Press,1998:303-308. 

【8】纪震,廖惠连,昊青华.粒子群算法及应用【M】.北京:科学出 

版社.2009. 

[7]Shi Y,Eberhart R C.A modiifed particle swarln optimizer[C】 

//IEEE International Conference on Evolutionary Computation. 

52— 


本文标签: 数据库 消息 过程