傳統 Web 應用透過輪詢、觸發器或訊息佇列獲取資料變更。SQL Server 2005 引入查詢通知,資料變更時主動通知應用,大幅減輕網路輪詢負擔,提升系統效能。
Service Broker 引入佇列機制至資料庫管理,使用佇列與服務通訊,服務再回呼實體。佇列、服務均為類資料表物件。ADO.NET 能與 Service Broker 通訊觸發機制並取回通知。
參與組件:查詢引擎、Service Broker、系統預存程序 sp_DispatcherProc、ADO.NET SqlNotificationRequest、SqlDependency、ASP.NET 2.0 Cache 類別。
SqlCommand.Notification 屬性附加通知資訊於 TDS 協定。-- 啟用 Service Broker ALTER DATABASE AdventureWorks SET ENABLE_BROKER; -- 檢查是否啟用 SELECT * FROM sys.databases; -- 觀察 is_broker_enabled -- 授權使用者訂閱查詢通知 GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [YourComputerName\UserName];
表單載入時啟動 SqlDependency.Start,建立連線、佇列、服務、清理預存程序、偵聽變更。ListProducts 方法使用 SqlDependency 註冊 OnChange 事件,查詢 Production.Product 範圍資料。使用者點擊更新按鈕執行 UPDATE,觸發通知,OnDependencyChanged 彈出確認視窗,透過 Me.Invoke 在主執行緒重新載入資料。
Private Sub ListProducts()
Dim dep As New SqlDependency()
AddHandler dep.OnChange, AddressOf OnDependencyChanged
Using cmd As New SqlCommand("SELECT ProductID, Name, ListPrice FROM Production.Product WHERE ProductID BETWEEN @Start AND @End", conn)
cmd.Parameters.Add("@Start", SqlDbType.Int).Value = txtStart.Text
cmd.Parameters.Add("@End", SqlDbType.Int).Value = txtEnd.Text
dep.AddCommandDependency(cmd)
' ... 執行讀取並填充 ListBox ...
End Using
End Sub
查詢通知是 .NET 2.0 重要特性,搭配 ASP.NET OutputCache 或中介層快取機制,能建立可擴展、響應迅速的應用。注意:SQL Server Express 需為具名執行個體才支援查詢通知。