2

我正在使用SQL服務器表充當我的應用程序中的隊列。我使用查詢通知使用SQL Dependency,值得注意的是Jeremiah Gowdy在此博客文章中使用的真棒實現。 http://jgowdy.blogspot.com/2010/01/sqldependency-query-notification-with.html使用Sql依賴關係查詢通知 - 停止檢測更改

我在Windows服務中實現了這個功能,並使用它來監聽SQL表上的變化,即我的隊列,並對返回的隊列內容進行處理,如果更改 - 請參閱下面的代碼,返回數據集存儲過程的內容。

問題是,在重負載或僅僅一段時間內,即使表中存在記錄,也不再檢測到更改。當我重新啓動服務時,更改將被檢測到!我試圖手動更新表,以觸發通知,但無濟於事。看起來通知服務在某些時候突然中斷,並且無法重新訂閱,但我無法確定。

Im拼命地試圖找到這個問題的解決方案,因爲我必須不斷觀察表中的變化,並在隊列卡住時重新啓動服務 - 不理想!

是否有其他人有任何關於SQL依賴和查詢通知的問題?特別是關於知識問題的任何指導或知識都會有所幫助。我知道更好的排隊系統存在,但我試圖解決這個問題,如果我可以而不是重新開發整個項目!

這是一段代碼片段。

//Initialisation 
public void StartWatcher() 
{ 
    SqlCommand cmd = new SqlCommand(); 
    cmd = new SqlCommand("TransferExportQueue"); 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 

    log.Info("Setting up SQL Watcher"); 
    //Setup the SQLWatcher 
    SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); 
    builder.ConnectionString = ConfigurationManager.ConnectionStrings["Connexion"].ConnectionString; 

    log.Info("Attempting to Start"); 
    SqlQueueWatcher = new SqlWatcher(builder.ConnectionString, cmd, SqlWatcher.SqlWatcherNotificationType.Blocking); 
    SqlQueueWatcher.OnChange += new SqlWatcher.SqlWatcherEventHandler(QueueSQLWatcher_OnChange); 
    SqlQueueWatcher.Start(); 

} 

//OnChangeEvent 
private void QueueSQLWatcher_OnChange(DataSet Result) 
{ 
    //perform logic in returned contents of stored procedure 
} 

這裏是我的存儲過程

Create PROCEDURE [dbo].[TransferExportQueue] 
AS 
BEGIN 

SELECT [Id] 
     ,[TransactionLogId] 
     ,[QueueDate] 
     ,[UpdateTable] 
FROM [dbo].[TransferExportQueue] 



END 

UPDATE: 我有一個SQL Server日誌和即時得到以下錯誤。

The query notification dialog on conversation handle '{9586CB6A-62BA-E311-983B-A0369F0A65D3}.' closed due to the following error: '<?xml version="1.0"?><Error xmlns="http://schemas.microsoft.com/SQL/ServiceBroker/Error"><Code>-8470</Code><Description>Remote service has been dropped.</Description></Error>'. 

看來,遠程服務持續下降,更多的挖掘後,似乎它的GOT與的SqlDependency如何完成其​​清理每次調用後訂閱的事。有誰知道如何解決這個問題?

+0

你只有一個初始化?如果不是那麼多少? – Rodion

+0

你的意思是「SqlQueueWatcher」實例?我有一個包含SqlQueueWatcher基本代碼的公共類,我的解決方案中的幾個其他項目從此實例化(大約8個項目)。 – gorillapower

+0

檢查你是否沒有初始化更多的實例,而不是數據庫中的池連接數 – Rodion

回答

2

閱讀本文:SqlDependency.OnChange callback timing。其要點是,你的應用程序有限的時間來處理OnChange回調或激活的過程計時器將踢入並殺死服務,破壞你的應用程序的破壞。就我個人而言,我不是設計的粉絲,但它是如此。

歡迎的人的俱樂部誰不得不放棄得心應手SqlDependency使用,它只是即時部署的基礎設施,並使用更基本SqlNotificationRequest類,這就需要你明確部署目標服務/隊列。你在易用性方面鬆了一口氣,你將獲得對行爲的控制權,如果你最終放棄目標服務,那麼你至少只會承擔責任;)

認真地儘管如此,從SqlDependency切換到SqlNotificationRequest相當容易,我推薦它。

+0

感謝Remus,我剛剛閱讀你的文章處理我的確切問題!所以沒有辦法解決這個問題?問題是應用程序是現場部署的,而這個問題只是真正出現在負載測試中!如果沒有得到一些編碼做... – gorillapower

+0

我只能說是享受你正在編碼:(如果還沒有現場事件,你將有時間來正確地設計它。 –

+0

感謝雷木思,是的,它是活的im fear。Battlestations。 – gorillapower