基于SqlServer 2008 Service Broker的分布式应用
最近在设计一个项目,两个子系统之间通过DB(Sql server 2008)相互共享数据,相互之间不能访问,但是一个子系统的操作完成之后必须快速得到另外一个子系统的响应,
为了解决异步之间的通讯,定时轮询数据库肯定是最差的解决方案,最后将方案定制使用Service Broker上,使用简单,简化了管理。
Service Broker介绍:SQL Server Service Broker 为消息和队列应用程序提供 SQL Server 数据库引擎本机支持。这使开发人员可以轻松地创建使用数据库引擎组件在完全不同的数据库之间进行通信的复杂应用程序。开发人员可以使用 Service Broker 轻松生成可靠的分布式应用程序。使用 Service Broker 的应用程序开发人员无需编写复杂的内部通信和消息,即可跨多个数据库分发数据工作负荷。因为 Service Broker 会处理会话上下文中的通信路径,所以这就减少了开发和测试工作。同时还提高了性能。例如,支持网站的前端数据库可以记录信息并将进程密集型任务发送到后端数据库以进行排队。Service Broker 确保在事务上下文中管理所有任务以确保可靠性和技术一致性。
Service Broker使用:
- 设置数据库支持Service Broker
ALTER DATABASE demo SET ENABLE_BROKER GO
demo为数据库名称
检查是否开启:Select DATABASEpRoPERTYEX('demo','IsBrokerEnabled') 如果为1表示成功。 - 使用demo:
CREATE TABLE [dbo].[test]( [test] [varchar](50) NOT NULL, CONSTRAINT [PK_test] PRIMARY KEY CLUSTERED ( [test] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO
在数据库中创建一个表test
C sharp代码如下:static string Connecting = "Data Source=.;Database=Demo;Uid=sa;Pwd=123456;Pooling=true;Connect Timeout=60;"; static void Main(string[] args) { testDBMessage(); } private static void testDBMessage() { Console.WriteLine("test sql server Communication:"); SqlDependency.Start(Connecting); UpdateData(); Console.ReadLine(); } private static void UpdateData() { string strSQL = "select test from dbo.test"; SqlDataAdapter da = new SqlDataAdapter(strSQL, Connecting); SqlDependency dependency = new SqlDependency(da.SelectCommand); dependency.OnChange += new OnChangeEventHandler(dependency_OnChange); DataTable dt = new DataTable(); da.Fill(dt); } private static void dependency_OnChange(object sender, SqlNotificationEventArgs e) { Console.WriteLine(string.Format(" data modify in {0}", DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"))); UpdateData(); }
通过上面的控制台程序,只要修改表test的数据,那么控制台会打印一条数据修改的记录。
我们可以利用Service Broker在做web中的数据缓存、异构程序之间的通讯等。