我正在使用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如何完成其清理每次調用後訂閱的事。有誰知道如何解決這個問題?
你只有一個初始化?如果不是那麼多少? – Rodion
你的意思是「SqlQueueWatcher」實例?我有一個包含SqlQueueWatcher基本代碼的公共類,我的解決方案中的幾個其他項目從此實例化(大約8個項目)。 – gorillapower
檢查你是否沒有初始化更多的實例,而不是數據庫中的池連接數 – Rodion