摘要:某公司的管理層想知道在一年的任何點的確切的年銷售以幫助他們計劃未來的策略。集合年銷售數據是存儲在TotalSalesDB數據庫中。銷售事務詳情被存儲在SalesDB數據庫中。為了保持的銷售數據更新,需要確保無論何時任何定單被處理和在SalesDB數據庫中交貨日期被更新的時候,定單的總錢數,應該被添加到TotalSalesDB數據庫的總年銷售中。為了解決上述問題,需要在數據庫中實現服務代理。該文詳細解釋了如何通過服務代理完成上述任務。
關鍵詞:服務代理;數據庫;服務;消息;協議;隊列
Message Passing between Databases Based on Service Broker
YOU Ying, ZHOU Wei
(Wuxi Institute of Technology,Wuxi 214121,China)
Abstract: A management of a company would like to know the exact year of any point of the annual sales to help them plan for the future strategy.Collection of annual sales data is stored in the TotalSalesDB database.Sales transaction details are stored in the SalesDB database.In order to maintain sales data updated whenever the need to ensure that any orders are processed and SalesDB database is updated when the delivery date,the total amount of money orders,should be added to the database TotalSalesDB total annual sales.In order to solve these problems,service agent is needed to achieve in the database.This article explains in detail how to accomplish these tasks through the service agent.
Key words: service broker;database;service;message;contract;queue
1 服務代理
服務代理提供了一個平臺,在它之上,允許數據庫開發人員創建服務,通過發送和接收消息相互通信。服務是為交流提供端點的數據庫對象。一個服務發送請求消息到另一個服務以使用提供的功能。
2 創建服務代理架構
服務代理是基于服務代理架構的。這個架構應該由下面的數據庫對象組成。
1)服務:是一個可為對話設置的地址端點。服務代理消息被從一個服務發送到另一個。參與對話的服務是兩個類型是發起者和處理服務。發起者服務初始化服務并且發送消息給處理服務。
2)消息:是服務間交換的數據。
3)消息類型:定交對話中參與者之間的消息的內容。消息類型對象定義了消息類型的名稱和消息可以包含的內容的類型。
4)協議:是參與程序間的約定,它定義他們之間將交換的消息。有些協議必須在參與對話的每個參與數據庫上創建。
5)隊列:是一個存儲消息的容器。每個服務與一個隊列關聯。當消息被發送給服務的時候,服務代理在隊列中放置消息。隊列以表的形式表示,這里每個消息是一行。每個行包含消息和它的信息,例如消息類型,發起者和目標服務。
6)服務程序:是一個提供邏輯給服務的程序。當一個消息被服務收到的時候,服務代理自動初始化服務程序并且將消息發送給程序。
3 實現兩個服務間的對話過程
在服務代理架構中,各種服務通過發送和接收消息互相對話。消息從一個服務發送到另一個以處理當服務接收消息的時候,它驗證消息是否與協議中指定的類型一樣。在驗證之后,消息被添加到隊列中。每個服務有與它關聯的服務程序。服務程序接收隊列中最上面的消息并且處理它。在處理完成之后,響應或確認也可以被發送到發起者服務。
兩個服務間的對話過程,如圖1所示。
服務代理程序通過服務發送和接收消息。消息從一個服務發送到另一個以處理。當服務接收消息的時候,就驗證消息是否與協約中指定的類型一樣。在驗證之后,消息被添加到隊列中。每個服務有與它關聯的服務程序。服務程序接收隊列中最上面的消息并處理。在處理完成后,響應或確認也可以被發送到發起者服務。
4 實現服務代理
為實現服務代理,首先創建服務代理對象例如消息,隊列,協議,服務。接著,開始一個對話。在對話開始之后,對象可以通過發送和接收消息互相通信。
第1步:創建TotalSalesDB數據庫和SalesDetails表,并添加數據。
執行后,如圖2所示。看到的是2009年初始年銷售記錄情況,總額為25000.00元。
圖22009年初始年銷售記錄情況
第2步:書寫發送消息方的腳本。
第3步:書寫接收消息方的腳本。
第4步:SalesOrderHeader表中創建觸發子,啟動會話,發送消息。
第5步:創建存儲過程,接收消息。
第6步:修改隊列,有消息進入,自動執行此存儲過程。
第7步:驗證。
在2009-07-20 16:43:54,有一筆新的定單1553.1035元發生在SalesDB數據庫中。執行后,如圖3所示。
圖32009-07-20 16:43:54發生了一筆新的定單
執行后,會看到TotalSalesDB數據庫中總的銷售額TotalSales被更新,總額為26553.1035元,如圖4所示。
圖4總的銷售額被更新
5 結束語
任務被完成。凡是在任何點只要有新定單在SalesDB數據庫中產生,就會看到TotalSalesDB數據庫中總的銷售額TotalSales被更新。服務代理也可用于大型分布式程序,處理位于不同位置的多個數據庫服務器的數據。例如信用卡服務的場景。當持卡的消費者通過信用卡進行了購買,信用卡詳情被難證購買事務被完成。而且,消費者必須為事務支付的總數的實體被存儲到發行信用卡的銀行的數據庫中。在這個周期結束的時候,一個統一的賬單被發送給消費者以接收信用數。消費者也可以通過銀行網點或電話服務隨時查詢自己的消費情況。而服務代理是基于消息的通信平臺,它有助于維護可靠的查詢處理和通信進行。
參考文獻:
[1] 劉輝.零基礎學SQL Server 2005[M].北京:機械工業出版社,2007.
[2] 錢雪忠.數據庫與SQL Server 2005教程[M].北京:清華大學出版社,2007.
[3] 孫全黨,張軍,鐘德源,等.SQL Server 2005數據庫開發應用教程[M].北京:電子工業出版社,2008.
[4] 詹英.數據庫技術與應用SQL Server 2005教程[M].北京:清華大學出版社,2008.