日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何使用SSB與數(shù)據(jù)庫通信

當(dāng)我們已經(jīng)將數(shù)據(jù)從xls,csv,txt等文件中的解析出來,進行必須的數(shù)據(jù)驗證,然后將正確的數(shù)據(jù)以XML格式保存到磁盤,并將事務(wù)型數(shù)據(jù)更新到DB,比如生成的磁盤文件名,CheckResult,CheckMemo等。

10年積累的成都網(wǎng)站制作、網(wǎng)站設(shè)計、外貿(mào)網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有桑植免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

我們再一起回顧下數(shù)據(jù)庫表設(shè)計:

 
 
 
  1. USE SSB3  
  2. GO  
  3.  
  4. CREATE TABLE [BatchInventoryQueue]  
  5. (  
  6.     TransactionNumber INT IDENTITY(1,1) NOT NULL,  
  7.     BatchFileID INT NOT NULL,  
  8.     RowIndex INT NOT NULL,  
  9.     ItemNumber INT NOT NULL,  
  10.     [FileName] NVARCHAR(256) NULL,  
  11.     HasCheck CHAR(1) NULL,  
  12.     CheckResult CHAR(1) NULL,  
  13.     CheckMemo NVARCHAR(2000) NULL,  
  14.     HasSendSSB CHAR(1) NULL, --是否嘗試發(fā)送過SSB  
  15.     SSBSendResult CHAR(1) NULL,--發(fā)送SSB是否成功  
  16.     SSBMemo NVARCHAR(2000) NULL,--SSB處理結(jié)果  
  17.     CONSTRAINT PK_TransactionNumber_BatchInventoryQueue PRIMARY KEY CLUSTERED  
  18.     (  
  19.         TransactionNumber ASC 
  20.     )  

下面我們要將正確的數(shù)據(jù)以XML格式發(fā)送到數(shù)據(jù)庫中。因為我們面臨的數(shù)據(jù)量非常大,所以我們需要考慮負載均衡,比如多臺服務(wù)器部署。那么就可能會面臨數(shù)據(jù)沖突的問題。我這里的情況是要求多臺服務(wù)器部署,那么如何給服務(wù)器分數(shù)據(jù),又不造成沖突呢?

方案一:用表的主鍵TransactionNumber與服務(wù)器數(shù)據(jù)取模

 
 
 
  1. SELECT TOP(@BatchSize) TransactionNumber,  
  2.     [FileName]  
  3. FROM dbo.BatchInventoryQueue  
  4. WHERE HasCheck='Y' AND CheckResult='S' 
  5. AND [FileName] IS NOT NULL 
  6. AND HasSendSSB IS NULL AND TransactionNumber%@Throtting=@TrottingMod   

優(yōu)點:實現(xiàn)簡單。

缺點:如果其中一臺服務(wù)器失敗,那么應(yīng)該屬于它處理的數(shù)據(jù)將一直得不到處理。

方案二:結(jié)合SQL Server的鎖特性,在查詢數(shù)據(jù)時避免沖突如下:

 
 
 
  1. UPDATE TOP(@BatchSize) dbo.BatchInventoryQueue  
  2. SET HasSendSSB='I'--inprocessing  
  3. OUTPUT DELETED.TransactionNumber,  
  4.     DELETED.[FileName]  
  5. WHERE HasCheck='Y' AND CheckResult='S' 
  6. AND [FileName] IS NOT NULL 
  7. AND HasSendSSB IS NULL  

將HasSendSSB更新為I,標示正在發(fā)送。由于在更新數(shù)據(jù)時,進程會獲取UPDLOCK,那么下一個服務(wù)器再查詢數(shù)據(jù)時就必須等待直到第一個進程更新完畢。并發(fā)執(zhí)行情況下,難免會有問題,因此需要考慮容錯機制。即用另一個Job定時監(jiān)視(SSBSendResult IS NULL OR SSBSendResult='N') AND HasSendSSB='I'的數(shù)據(jù),并將狀態(tài)清空(SET HasSendSSB=NULL,SSBSendResult=NULL),等待程序下次再次處理。不過這種情況應(yīng)該非常少。

 
 
 
  1. UPDATE dbo.BatchInventoryQueue  
  2. SET HasSendSSB=NULL,  
  3. SSBSendResult=NULL 
  4. WHERE (SSBSendResult IS NULL OR SSBSendResult='N')  
  5. AND HasSendSSB='I' 

接著我們要生成SSBMessage,這里我使用VTemplate模版引擎來生成.代碼如下:

SSBMessageBase:

 
 
 
  1. public abstract class SSBMessageBase  
  2. {  
  3.     public string Subject { get; set; }  
  4.  
  5.     public string FromService { get; set; }  
  6.  
  7.     public string ToService { get; set; }  
  8.  
  9.     public SSBMessageHead Head { get; set; }  
  10. }  

SSBMessageHead:

 
 
 
  1. public class SSBMessageHead  
  2. {  
  3.     public string Action { get; set; }  
  4.  
  5.     public string TransactionCode { get; set; }  
  6. }  

SSBMessageFromFile:

 
 
 
  1. public class SSBMessageFromFile : SSBMessageBase  
  2. {  
  3.     public string FileName { get; set; }  
  4. }  

VTemplate:

 
 
 
  1.  
  2.  
  3. {$:ssb.Subject}/Subject>  
  4. {$:ssb.FromService}  
  5. {$:ssb.ToService}  
  6.  
  7.       
  8.         {$:ssb.Action}  
  9.         {$:ssb.TransactionCode}  
  10.       
  11.       
  12.       
  13.       
  14.  
  15.  
  16.  

SSBUtility:

 
 
 
  1. public class SSBUtility  
  2. {  
  3.     private string VtSSBMessage(SSBMessageBase ssb)  
  4.     {  
  5.         string fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,@"Templates\SSB.vt");  
  6.          
  7.         TemplateDocument doc =new TemplateDocument(fileName, Encoding.UTF8);  
  8.         doc.SetValue("ssb", ssb);  
  9.  
  10.         StringBuilder sb = new StringBuilder();  
  11.         StringWriter sw = new StringWriter(sb);  
  12.         doc.Render(sw);  
  13.         sw.Close();  
  14.  
  15.         return sb.ToString();  
  16.     }  
  17.  
  18.     public void SendSSB(SSBMessageBase ssb)  
  19.     {  
  20.         string msg = VtSSBMessage(ssb);  
  21.         using (SqlConnection conn = new SqlConnection(JobConfigs.SSBConnectionString))  
  22.         {  
  23.             using (SqlCommand cmd = new SqlCommand())  
  24.             {  
  25.                 cmd.Connection = conn;  
  26.                 cmd.CommandType = CommandType.StoredProcedure;  
  27.                 cmd.CommandText = JobConfigs.SSBSendProc;//dbo.[UP_Send_Inventory]  
  28.                 SqlParameter p = new SqlParameter("@Message", SqlDbType.Xml);  
  29.                 p.Value = msg;  
  30.                 cmd.Parameters.Add(p);  
  31.                 conn.Open();  
  32.                 cmd.ExecuteNonQuery();  
  33.                 conn.Close();  
  34.             }  
  35.         }  
  36.     }  
  37. }  

再接著就是SSB創(chuàng)建部分,下面列舉代碼示例:

 
 
 
  1. USE [master]  
  2. GO  
  3.  
  4. IF EXISTS(SELECT * FROM sys.databases where [name]='SSB')  
  5.     DROP DATABASE SSB  
  6.  
  7. CREATE DATABASE SSB  
  8. GO  
  9.  
  10. --enable service broker on database  
  11. ALTER DATABASE SSB  
  12. SET TRUSTWORTHY ON 
  13. GO  
  14. USE SSB  
  15. GO  
  16.  
  17. --create a test table  
  18. CREATE TABLE dbo.Inventory  
  19. (  
  20.     [ItemNumber] INT IDENTITY(1,1) PRIMARY KEY,  
  21.     [Inventory] INT NOT NULL 
  22. )  
  23.  
  24. INSERT INTO dbo.Inventory([Inventory])  
  25. VALUES(1)  
  26.  
  27. GO  
  28. --create message type and contract  
  29. CREATE MESSAGE TYPE [Message_Type_Inventory]  
  30. VALIDATION = WELL_FORMED_XML;  
  31.  
  32. CREATE CONTRACT [Contract_Inventory]  
  33. (  
  34.     [Message_Type_Inventory] SENT BY INITIATOR  
  35. )  
  36. GO  
  37.  
  38. --create queue, send service and receive  
  39. CREATE QUEUE [Queue_Inventory]  
  40. WITH STATUS=ON,  
  41. RETENTION=OFF;  
  42.  
  43. CREATE SERVICE [Service_Send_Inventory]  
  44. ON QUEUE [Queue_Inventory]([Contract_Inventory])  
  45. GO  
  46.  
  47. CREATE SERVICE [Service_Receive_Inventory]  
  48. ON QUEUE [Queue_Inventory]([Contract_Inventory])  
  49. GO  
  50.  
  51. --receive procedure  
  52. CREATE PROCEDURE dbo.[UP_Receive_Inventory]  
  53. AS 
  54. BEGIN 
  55.     SET NOCOUNT ON;  
  56.     DECLARE @ConversionHandle UNIQUEIDENTIFIER,  
  57.         @MessageType SYSNAME,  
  58.         @Message XML,  
  59.         @ItemNumber CHAR(50),  
  60.         @Inventory INT 
  61.  
  62.     WHILE(1=1)  
  63.     BEGIN 
  64.         WAITFOR(     
  65.         RECEIVE TOP(1) @ConversionHandle=conversation_handle,  
  66.                 @MessageType=message_type_name,  
  67.                 @Message=CAST(message_body AS XML)  
  68.             FROM [Queue_Inventory]  
  69.         ),TIMEOUT 1000  
  70.         IF(@@ROWCOUNT=0)  
  71.             BREAK;  
  72.  
  73.         SELECT @ItemNumber=@Message.value('(/Publish/Message/Body/Inventory/ItemNumber/text())[1]','INT'),  
  74.             @Inventory=@Message.value('(/Publish/Message/Body/Inventory/Inventory/text())[1]','INT')  
  75.          
  76.         UPDATE dbo.Inventory  
  77.         SET Inventory=@Inventory  
  78.         WHERE ItemNumber=@ItemNumber  
  79.     END 
  80. END 
  81. GO  
  82.  
  83. --activate queue  
  84. ALTER QUEUE [Queue_Inventory]  
  85. WITH ACTIVATION  
  86. (  
  87.     PROCEDURE_NAME=[UP_Receive_Inventory],  
  88.     MAX_QUEUE_READERS=5,  
  89.     EXECUTE AS OWNER  
  90. )  
  91. GO  
  92.  
  93. --send procedure  
  94. CREATE PROCEDURE dbo.[UP_Send_Inventory]  
  95. (  
  96.     @Message XML  
  97. )  
  98. AS 
  99. BEGIN 
  100.     SET NOCOUNT ON;  
  101.     DECLARE @ConversationHandle UNIQUEIDENTIFIER  
  102.      
  103.     BEGIN DIALOG CONVERSATION @ConversationHandle  
  104.     FROM SERVICE [Service_Send_Inventory]  
  105.     TO SERVICE 'Service_Receive_Inventory' 
  106.     ON CONTRACT [Contract_Inventory]  
  107.     WITH ENCRYPTION = OFF;  
  108.  
  109.     SEND ON CONVERSATION @ConversationHandle  
  110.     MESSAGE TYPE [Message_Type_Inventory](@Message)  
  111.      
  112.     END CONVERSATION @ConversationHandle WITH CLEANUP;  
  113. END 
  114. GO  
  115.  
  116. --test data  
  117. DECLARE @Message XML  
  118. SELECT @Message='  
  119.  
  120. BatchInventory  
  121. Service_Send_Inventory  
  122. Service_Receive_Inventory  
  123.  
  124.       
  125.         UpdateInventory  
  126.         123  
  127.       
  128.       
  129.           
  130.             1  
  131.             200  
  132.           
  133.       
  134.  
  135. '  
  136.  
  137. SELECT * FROM dbo.[Inventory]  
  138. --send  
  139. EXEC dbo.[UP_Send_Inventory] @Message  
  140.  
  141. WAITFOR DELAY '00:00:30' 
  142. SELECT * FROM Inventory  

原文鏈接:http://www.cnblogs.com/fuhongwei041/archive/2011/04/18/ssb.html

【編輯推薦】

  1. 如何通過注入SQL語句盜取網(wǎng)站管理權(quán)限
  2. SQL Server 2008中的代碼安全
  3. SQL Server 2005數(shù)據(jù)庫SA的相關(guān)安全性設(shè)置
  4. SQL Server與Oracle數(shù)據(jù)庫在安全性上的異同
  5. Sql server安全設(shè)置九大措施

網(wǎng)站標題:如何使用SSB與數(shù)據(jù)庫通信
網(wǎng)址分享:http://www.dlmjj.cn/article/dhchped.html