17

我正在開發此應用程序的VB.net 2010SQL 2008
我希望通知客戶端有關數據庫的更新,以及使用定時器檢查數據庫中指定分鐘更改的應用程序,這實際上效率不高。我閱讀了大約query notification,sqldependency,service broker,但後來我讀了一些說,如果我有100個客戶端,並且我使用查詢通知將通知推送到我的應用程序,他們可能效率不高。
有人會幫助我應該做什麼,以及我如何做到這一點(如果有示例可用,會非常有幫助)。提前致謝!我希望我的數據庫(SQL)通知或推送更新到客戶端應用程序

回答

16

查詢通知將推送到Service Broker服務,而不是直接發送到您的應用程序。瞭解它是如何工作的,請參見The Mysterious Notification。您的應用程序正在通過在數據庫上發佈WAITFOR(RECEIVE)聲明來等待通知。這意味着100個客戶端中的每一個都佔用一個SQL Server工作線程(這是有限制的,請參閱max worker threads選項)。我已經看到這在+1000客戶端的生產環境中工作(在碰到最大工作線程選項之後),但我會建議之間。

我的建議是使用SqlDependency/QueryNotifications使一個服務監控變更。然後,該服務會將通知(例如使用WCF)推送到所有正在運行的應用程序。您將訂閱通用更改(the table Foo was changed),而不是特定更改(the row x in table Foo was inserted)。

作爲一般規則,SqlDependency/Query Notifications只能通知您數據已更改,但不會推送新的數據。應用程序必須在通知後再次運行查詢來刷新其本地數據集。

3

要小心使用SqlDependency類 - 它有內存泄漏problems。 Hovewer,你可以使用SqlDependency類的開源實現 - SqlDependencyEx。它使用數據庫觸發器和本機Service Broker通知來接收有關表更改的事件。這是一個用法示例:

int changesReceived = 0; 
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
      TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{ 
    sqlDependency.TableChanged += (o, e) => changesReceived++; 
    sqlDependency.Start(); 

    // Make table changes. 
    MakeTableInsertDeleteChanges(changesCount); 

    // Wait a little bit to receive all changes. 
    Thread.Sleep(1000); 
} 

Assert.AreEqual(changesCount, changesReceived); 

使用SqlDependecyEx,您可以監視UPDATE,避免DELETE和INSERT。希望這可以幫助。

相關問題