最近在設計一個項目,兩個子系統之間通過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中的數據緩存、異構程序之間的通訊等。