简介:SQL Server Service Broker,以下简称SSB,是一种完全基于MSSQL数据库的数据处理技术,为短时间内处理大量数据提供了一种可靠、稳定、高效的解决方案。一次同步的数据最大可达2G,采用二进制传输,多线程处理数据。可以理解为数据库中的消息中间件。

  根据负载类型分,SSB有Windows负载类型和证书类型,由于证书类型不支持跨集群的数据传输,故不讨论,用Windows负载类型。后续脚本都是Windows负载类型的脚本。

  SQL Server版本在2008及以上。

应用场景

  • 外部数据进入DB(如XML、TXT等文档中的数据,文档中的数据需用程序读取)
  • DB之间的数据同步:包括同server不同DB,不同server之间,集群之间的数据同步

优点:安全、稳定可靠、解耦合、多线程、处理数据很快、对网络的实时连接要求不高

缺点:跨集群的解决方案很复杂,实施起来不易;查找数据处理失败的异常原因比较困难;

实施方案--同server不同DB:新建数据库的步骤省略,跨server的实施方案见下一个篇

消息发送方配置脚本:

--第一步:用户数据库开启service broker服务
USE master
GO
select is_broker_enabled,service_broker_guid,* from sys.databases where name IN ('QEC_Interface')--is_broker_enabled是1表示开启,0反之
ALTER DATABASE QEC_Interface SET NEW_BROKER WITH ROLLBACK IMMEDIATE --遇到无法执行下面的语句时,先执行这一条语句:回滚事务 ALTER DATABASE QEC_Interface SET ENABLE_BROKER
ALTER DATABASE QEC_Interface SET TRUSTWORTHY ON GO --第二步:发送方用户数据库上创建消息类型:消息类型的名称要与接收方的名称完全相同(区分大小写)
use QEC_Interface
go
create message type [//qciscm05/QEC_Interface/NoneCustomsSend]
validation = well_formed_xml
--For Receiving MessageType
create message type [//qciscm05/QEC_Interface/NoneCustomsReceived]
validation = well_formed_xml
--第三步:用户数据库上创建约定:约定的名称要与接收方的名称完全相同(区分大小写)
create contract [//qciscm05/QEC_Interface/NoneCustomsContract]
( [//qciscm05/QEC_Interface/NoneCustomsSend] SENT BY INITIATOR,
[//qciscm05/QEC_Interface/NoneCustomsReceived] SENT BY TARGET
)
--第四步:用户数据库上创建队列
create queue InterfaceNoneCustomsQueue
with status=on
--第五步:用户数据库上创建服务
create service [//qciscm05/QEC_Interface/NoneCustomsService]
on queue InterfaceNoneCustomsQueue
([//qciscm05/QEC_Interface/NoneCustomsContract]) -----------------------------------------------------
--目标队列绑定SP,自动处理反馈消息
alter queue InterfaceNoneCustomsQueue
with status = on,
activation(
status = ON,
procedure_name= [dbo].[SP_SSB_HandleReceiveNoneCustoms],
max_queue_readers=50,
execute as self
); ---=手动发送消息 exec SP_SSB_SendNoneCustoms 'TEHP1301996QN','<XML>
<RESPONSECONTENT>
<RESPONSE_MESID>C4EE2C5C758A4656800B6617BAC5B541</RESPONSE_MESID>
<APPL_TYPE>A</APPL_TYPE>
<DECLARE_TYPE>GJN</DECLARE_TYPE>
<STEP_ID />
<SEQ_NO>TEHP1301996QN</SEQ_NO>
<JOB_NO>GJAtestOK</JOB_NO>
<RESULT_CODE>OK01</RESULT_CODE>
<RESULT_INFO />
</RESPONSECONTENT>
</XML>' --==基本查询操作
select conversation_handle,state_desc,* from sys.conversation_endpoints--查看当前数据库中开启的会话
select conversation_handle,cast(message_body as xml),* from InterfaceNoneCustomsQueue--查看队列中的消息
select transmission_status,cast(message_body as xml),* from sys.transmission_queue --查看当期数据库中待传送的消息

发送方脚本

消息接受方配置脚本:

--第一步:用户数据库开启service broker服务
use master
go
select is_broker_enabled,service_broker_guid,* from sys.databases where name IN ('QEC')
ALTER DATABASE QEC SET NEW_BROKER WITH ROLLBACK IMMEDIATE --遇到无法执行下面的语句时,先执行这一条语句 ALTER DATABASE QEC set ENABLE_BROKER
ALTER DATABASE QEC SET TRUSTWORTHY ON go --第二步:发送方用户数据库上创建消息类型:消息类型的名称要与发送方的名称完全相同(区分大小写)
use QEC
go
create message type [//qciscm05/QEC_Interface/NoneCustomsSend]
validation = well_formed_xml
--For Receiving MessageType
create message type [//qciscm05/QEC_Interface/NoneCustomsReceived]
validation = well_formed_xml
--第三步:用户数据库上创建约定:约定的名称要月发送方的名称完全相同(区分大小写)
create contract [//qciscm05/QEC_Interface/NoneCustomsContract]
( [//qciscm05/QEC_Interface/NoneCustomsSend] SENT BY INITIATOR,
[//qciscm05/QEC_Interface/NoneCustomsReceived] SENT BY TARGET
)
--第四步:用户数据库上创建队列
create queue QECNoneCustomsQueue
with status=on
--第五步:用户数据库上创建服务
create service [//qciscm05/QEC/NoneCustomsService]
on queue QECNoneCustomsQueue
([//qciscm05/QEC_Interface/NoneCustomsContract]) --==队列绑定SP,自动处理队列中接收到的消息
alter queue QECNoneCustomsQueue
with status = on, --on设置队列为启用,off相反
activation(
status = on, --on设置绑定的SP为激活状态,off相反
procedure_name=SP_SSB_HandleMessageForNoneCustoms, --指定要绑定的SP
max_queue_readers=50, --设置并发数:SP同时处理消息的进程数,多线程(最大值32767)
execute as self --指定SP以当前用户身份执行
);
--==
select conversation_handle,conversation_id,state_desc,* from sys.conversation_endpoints--查看当前数据库中开启的会话
select conversation_handle,cast(message_body as xml),* from QECNoneCustomsQueue--查看队列中的消息
select transmission_status,cast(message_body as xml),* from sys.transmission_queue --查看当期数据库中待传送的消息

接收方脚本

Service Broker应用(1):简介、同server不同DB间的数据传输的更多相关文章

  1. SQL Server Service Broker 简单例子 (转)

    SQL Server Service Broker服务体系结构 消息类型 — 定义应用程序间交换的消息的名称.还可以选择是否验证消息.约定 — 指定给定会话中的消息方向和消息类型.队列 — 存储消息. ...

  2. The SQL Server Service Broker for the current database is not enabled

    把一个数据恢复至另一个服务器上,出现了一个异常: The SQL Server Service Broker for the current database is not enabled, and ...

  3. 基于SQL Server 2008 Service Broker构建企业级消息系统

    注:这篇文章是为InfoQ 中文站而写,文章的地址是:http://www.infoq.com/cn/articles/enterprisemessage-sqlserver-servicebroke ...

  4. Service Broker应用(2):不同server间的数据传输,包含集群

    不同Server之间的数据传输,包含DB使用AlwaysOn 配置脚本: SQL Server Service Broker 跨集群通信 具体的TSQL 脚本语句如下.注意的是TSQL语句是在发送方还 ...

  5. SQL Server 2005 Service Broker

    一.引言 SQL Server 2005 的一个主要成就是可以实现可靠.可扩展且功能完善的数据库应用程序.与 .NET Framework 2.0 公共语言运行库 (CLR) 的集成使开发人员可以将重 ...

  6. [杂]SQL Server 之 Service Broker

    由于某些原因,我们的缓存依赖于数据库,而数据库反向通知需要依赖和使用ServiceBroker, 由于Deploy的人往往不是很清楚这个SB需要如何部署,特此记录. 判断数据库是否启用了Service ...

  7. SQL Server Service Broker创建单个数据库会话

    概述 SQL Server Service Broker 用来创建用于交换消息的会话.消息在目标和发起方这两个端点之间进行交换.消息用于传输数据和触发消息收到时的处理过程.目标和发起方既可以在同一数据 ...

  8. SQL Server Service Broker创建单个数据库会话(消息队列)

    概述 SQL Server Service Broker 用来创建用于交换消息的会话.消息在目标和发起方这两个端点之间进行交换.消息用于传输数据和触发消息收到时的处理过程.目标和发起方既可以在同一数据 ...

  9. 未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker

    昨晚遇到的这个问题,也知道Notifications service依赖底层的Service broker的.本以为只需要执行以下脚本对数据库启用Service broker即可. alter dat ...

随机推荐

  1. 更改eclipse的Package Explorer的字体

    说一个牛B的不像实力派的东西 — 更改eclipse的Package Explorer的字体1. 打开eclipse目录/Applications/Eclipse.app/Contents/Eclip ...

  2. eclipse下的,maven+spring+springMVC+mabatis+mysql.创建

    环境:window系统,64位工具:eclipse:下载地址:            链接:http://pan.baidu.com/s/1hr73LE8 密码:vcsa        tomcat: ...

  3. spring定时器,当遇见半小时的情况时

    spring定时器遇见半小时的解决方法(这里只提供注解方式) @Scheduled(fixedRate=6000000)//每隔100分钟执行方法 fixedRate的值是毫秒

  4. java中异常抛出后代码是否会继续执行

    为了回答这个问题,我编写了几段代码测试了一下,结果如下:  代码1:throw new Exception("参数越界");   System.out.println(" ...

  5. Java_ToolKit用法

    转自:http://blog.sina.com.cn/s/blog_9e4556250100z5kv.html 此类是所有 Abstract Window Toolkit 实际实现的抽象超类.Tool ...

  6. 并列统计CASE WHEN

    select sum(case when depart = 'Physical' then 1 else 0 end) PhyTotal, sum(case when depart = 'Chemis ...

  7. SQLite3中自增主键归零方法

    当SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表.这个表包含两个列:name和seq.name记录自增列所在的表,seq记录当前序号(下一条记录的编号就是当 ...

  8. shell-参数做下标

    test.sh #!/bin/bash#用第3个参数作为下标或position,来获取参数param=$(eval echo \$$3)echo "hello, $param"

  9. 深入springMVC------文件上传源码解析(上篇)

    最近在项目中,使用springmvc 进行上传文件时,出现了一个问题: org.springframework.web.multipart.MultipartException: The curren ...

  10. I:trainage Ditches

    总时间限制: 1000ms 内存限制: 65536kB描述Every time it rains on Farmer John's fields, a pond forms over Bessie's ...