首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2005 查詢通知機制:主動式資料變更通知實作詳解

     編輯:關於SqlServer

前言:從輪詢到主動通知的範式轉移

傳統 Web 應用透過輪詢、觸發器或訊息佇列獲取資料變更。SQL Server 2005 引入查詢通知,資料變更時主動通知應用,大幅減輕網路輪詢負擔,提升系統效能。

核心架構:Service Broker 驅動

Service Broker 引入佇列機制至資料庫管理,使用佇列與服務通訊,服務再回呼實體。佇列、服務均為類資料表物件。ADO.NET 能與 Service Broker 通訊觸發機制並取回通知。

參與組件:查詢引擎、Service Broker、系統預存程序 sp_DispatcherProc、ADO.NET SqlNotificationRequest、SqlDependency、ASP.NET 2.0 Cache 類別。

通知流程示意

  1. SqlCommand.Notification 屬性附加通知資訊於 TDS 協定。
  2. SQL Server 註冊通知並執行查詢。
  3. 監控後續 DML,判斷是否影響先前結果集,影響則發送訊息至 Service Broker。
  4. Service Broker 佇列有訊息時:
    • 前端應用偵聽佇列,ADO.NET 自動讀取觸發事件。
    • 高階應用自行處理佇列訊息。

啟用 AdventureWorks 範例資料庫通知環境

-- 啟用 Service Broker
ALTER DATABASE AdventureWorks SET ENABLE_BROKER;
-- 檢查是否啟用
SELECT * FROM sys.databases; -- 觀察 is_broker_enabled
-- 授權使用者訂閱查詢通知
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [YourComputerName\UserName];

Windows Forms 範例程式碼解析

表單載入時啟動 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

適用場景與限制

  • 適用不常變更的資料(下拉選單:產品、省份、供應商、銷售人員)。
  • 建議用於伺服器端應用(ASP.NET、Remoting),而非用戶端 WinForms。
  • 大量用戶端同時註冊會消耗伺服器資源,微軟建議用戶端並發不超過 10。
  • 大型應用(如百萬用戶軟體更新)可緩存查詢結果,直接服務相符查詢,減少伺服器負載。

結語

查詢通知是 .NET 2.0 重要特性,搭配 ASP.NET OutputCache 或中介層快取機制,能建立可擴展、響應迅速的應用。注意:SQL Server Express 需為具名執行個體才支援查詢通知。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved