~WPF C#~
這篇文章被我擱置了有點久,剛剛看到草稿才想到原來還沒寫完XD
在這裡簡單的 DEMO 一下 Service Broker 與 AP 的搭配應用
早期為了要達成即時更新資料,較常見的就是用 Timer 每隔幾分鐘、幾秒鐘就得到資料庫要資料
(或是自己 DIY 點一下 refresh... 等等)
越是即時的更新越需要頻繁的查詢,接下來就得面對 Session 變多、Loading 變重... 等問題
現今已經有很多方法可以即時更新資料又能夠減輕 Loading 而 Service Broker 就是其中一種
透過資料推播方式搭配 NLB... 等架構,達到節能減碳降低資料庫的重擔
但~切記!Service Broker 的運用上有許多小細節必須考量噢!才不會把一番美意給搞砸了~
(其實不管什麼方法都是一樣,合適的架構搭配合適的方法才能突顯其優點)
首先來建立範本資料庫及相關設定
USE [master];
GO
CREATE DATABASE MyTestDb;
GO
ALTER DATABASE MyTestDb SET ENABLE_BROKER;
GO
USE MyTestDb;
GO
CREATE TABLE EM
(
ErrMsg NVARCHAR(MAX) NOT NULL
) ON [PRIMARY];
GO
接下來 C# 的部份使用 SqlDependency 與 Service Broker 介接
若沒有指定 Queue Name 時 SqlDependency 將會自動建立亂數命名
但是這裡我想要自己定義名稱 MyNotificationQueue 以便日後管理
private void GoTest()
{
SqlDependency.Start(conn.ConnectionString, "MyNotificationQueue");
RegisterDependency();
}
再來我希望透過 Service 來監控 EM 這個表的資料變化
public void RegisterDependency()
{
using (SqlConnection connection = new SqlConnection(conn.ConnectionString))
{
try
{
SqlCommand command = new SqlCommand("SELECT ErrMsg FROM EM", connection);
SqlDependency dependency = new SqlDependency(command, "Service=MyNotificationService;local database=MyTestDb", int.MaxValue);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
connection.Open();
SqlDataReader reader = command.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
dgData.Dispatcher.BeginInvoke(new Action(() => dgData.ItemsSource = dt.AsDataView()));
}
catch { }
}
}
這樣就能透過 SQL Server 推播資料給 Service 即時更新 Clients 畫面
have fun ʕ•͡ᴥ•ʔ