クエリ通知使ってみよう
DESCRIPTION
TRANSCRIPT
2011/04/16
お だ
クエリ通知を使ってみよう
自己紹介クエリ通知ってなに?使ってみたどこで使う?まとめ
アジェンダ
織田 信亮大阪で 開発者 してます。個人的に興味のある技術等を blog で取り上げてます。 http:/d.hatena.ne.jp/odashinsuke/
SQL World/ わんくま同盟 /JGGUG の勉強会に参加してます。
自己紹介
クエリ通知ってなに?
クエリ通知とはSQL Server 2005 から導入された、クエリの結果が変化したときに、 SQL Server から通知されるようにアプリケーションが要求できる機能。
どんなことが出来る?データが変更された時に、アプリケーションのイベントハンドラが SQL Server からの通知を受信し、再度データを取得する。
データ取得変更通知のサブスクライブ
変更通知の送信
Service Broker を利用しているインデックス付きビューで使用されている、変更検出のメカニズムに基づいているORACLE の「 Materialized View 」 ( マテリアライズドビュー ) と似た感じ。
使ってみた
注意事項SQL Server のサービス アカウント
通知の受信クエリ通知およびトランザクション迅速な更新とクエリ通知SET オプションの設定
http://msdn.microsoft.com/ja-jp/library/aewzkxxh(VS.90).aspx
SQL Server のサービス アカウント
ローカルシステムアカウント を使わないこと
通知の受信Windws 95/98 では、通知を受信出来ません!※Windows 98 では、 .NET Framework 2.0 はサポートされています。
http://msdn.microsoft.com/ja-jp/netframework/cc807061
クエリ通知およびトランザクション1 トランザクション内で、複数回変更されたとしても、通知は 1 回です。
迅速な更新とクエリ通知更新が頻繁にある場合、通知も次々と飛んでくる!
SET オプションの設定ANSI_NULLS ON
ANSI_PADDING ON
ANSI_WARNINGS ON
CONCAT_NULL_YIELDS_NULL ON
QUOTED_IDENTIFIER ON
NUMERIC_ROUNDABORT OFF
ARITHABORT ON
SELECT ステートメントが対象EXECUTE ステートメント経由も可
インデックス付きビューを作成するために使用できる任意のクエリに対して通知を要求できます。
サポートされているクエリテーブル名は、 2 つの部分から構成される名前で指定するスキーマ から指定する。
* を使用して列の指定は出来ない名前の無い列や列の重複は出来ない利用出来ない集計関数がある計算列があるテーブルは参照出来ない
非決定的関数は使えない外部結合や自己結合、サブクエリも使えない
UNION, INTERSECT, EXCEPT も使えない
TOP 句も使えない..etc 他にも制約があります
http://msdn.microsoft.com/ja-jp/library/ms181122.aspxhttp://msdn.microsoft.com/ja-jp/library/aewzkxxh(VS.90).aspx
通知のサブスクライブT-SQL では無理!SqlClient(ADO.NET) から登録SOAP を利用する
SQL Server って SOAP の Web サービスとして公開出来る!-> 将来的に削除される機能だから、使うなよ!http://technet.microsoft.com/ja-jp/library/ms186386.aspx
通知が発生するタイミングクエリ結果に含まれている行が変更されたサブスクリプションの有効期限が切れたサーバーが再起動されたクエリ通知サブスクリプションを作成できなかった (SELECT ステートメントが準拠していない等 )
サーバーの負荷が高いサブスクリプションが依存しているオブジェクトが削除または変更された
http://msdn.microsoft.com/ja-jp/library/ms188323.aspx
ADO.NET での利用SqlNotificationRequest
下位レベル Interface
高度な制御が可能SqlDependency
上位レベル Interface
お手軽に使える
SqlDependency を使ってみるクエリ通知の有効化
セキュリティの設定.NET アプリが部分信頼で実行されるなら SqlClientPermission の設定が必要
ALTER DATABASE [databaseName] SET ENABLE_BROKER;GO
CREATE QUEUE ContactChangeMessages;CREATE SERVICE ContactChangeNotifications ON QUEUE ContactChangeMessages ([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);
デモWindows Form アプ
リSilverlight アプリ
実装時の注意点テーブルはスキーマから指定すること準拠していないクエリを指定するとエライ事になる通知イベントがひたすら呼ばれる
通知イベントは UI スレッドとは違うスレッドで実行される場合がある。UI コントロールにアクセスするには、Invoke or Dispatcher 経由で
どこで使う?
キャッシュ用途として…マスタデータ ( 頻繁に更新されない )
商品カタログとか…システムデータ
テンプレートエンジンに利用しているデータとか…
ログイン時 / 画面生成時に取得する制御用データとか…
楽観排他 のユーザービリティ向上
まとめ
変更を通知してくれる機能があるよ!
制約は インデックス付きビューと似てるよ!
ADO.NET からの利用が一般的だよ!
通知イベントは別スレッドで実行されるよ!