クエリ通知使ってみよう

27
2011/04/16 お お クククククク クククククク

Upload: oda-shinsuke

Post on 26-Jan-2015

3.854 views

Category:

Technology


4 download

DESCRIPTION

 

TRANSCRIPT

Page 1: クエリ通知使ってみよう

2011/04/16

お だ

クエリ通知を使ってみよう

Page 2: クエリ通知使ってみよう

自己紹介クエリ通知ってなに?使ってみたどこで使う?まとめ

アジェンダ

Page 3: クエリ通知使ってみよう

織田 信亮大阪で 開発者 してます。個人的に興味のある技術等を blog で取り上げてます。 http:/d.hatena.ne.jp/odashinsuke/

SQL World/ わんくま同盟 /JGGUG の勉強会に参加してます。

自己紹介

Page 4: クエリ通知使ってみよう

クエリ通知ってなに?

Page 5: クエリ通知使ってみよう

クエリ通知とはSQL Server 2005 から導入された、クエリの結果が変化したときに、 SQL Server から通知されるようにアプリケーションが要求できる機能。

Page 6: クエリ通知使ってみよう

どんなことが出来る?データが変更された時に、アプリケーションのイベントハンドラが SQL Server からの通知を受信し、再度データを取得する。

データ取得変更通知のサブスクライブ

変更通知の送信

Page 7: クエリ通知使ってみよう

Service Broker を利用しているインデックス付きビューで使用されている、変更検出のメカニズムに基づいているORACLE の「 Materialized View 」 ( マテリアライズドビュー ) と似た感じ。

Page 8: クエリ通知使ってみよう

使ってみた

Page 9: クエリ通知使ってみよう

注意事項SQL Server のサービス アカウント

通知の受信クエリ通知およびトランザクション迅速な更新とクエリ通知SET オプションの設定

http://msdn.microsoft.com/ja-jp/library/aewzkxxh(VS.90).aspx

Page 10: クエリ通知使ってみよう

SQL Server のサービス アカウント

ローカルシステムアカウント を使わないこと

Page 11: クエリ通知使ってみよう

通知の受信Windws 95/98 では、通知を受信出来ません!※Windows 98 では、 .NET Framework 2.0 はサポートされています。

http://msdn.microsoft.com/ja-jp/netframework/cc807061

Page 12: クエリ通知使ってみよう

クエリ通知およびトランザクション1 トランザクション内で、複数回変更されたとしても、通知は 1 回です。

Page 13: クエリ通知使ってみよう

迅速な更新とクエリ通知更新が頻繁にある場合、通知も次々と飛んでくる!

Page 14: クエリ通知使ってみよう

SET オプションの設定ANSI_NULLS ON

ANSI_PADDING ON

ANSI_WARNINGS ON

CONCAT_NULL_YIELDS_NULL ON

QUOTED_IDENTIFIER ON

NUMERIC_ROUNDABORT OFF

ARITHABORT ON

Page 15: クエリ通知使ってみよう

SELECT ステートメントが対象EXECUTE ステートメント経由も可

インデックス付きビューを作成するために使用できる任意のクエリに対して通知を要求できます。

Page 16: クエリ通知使ってみよう

サポートされているクエリテーブル名は、 2 つの部分から構成される名前で指定するスキーマ から指定する。

* を使用して列の指定は出来ない名前の無い列や列の重複は出来ない利用出来ない集計関数がある計算列があるテーブルは参照出来ない

Page 17: クエリ通知使ってみよう

非決定的関数は使えない外部結合や自己結合、サブクエリも使えない

UNION, INTERSECT, EXCEPT も使えない

TOP 句も使えない..etc 他にも制約があります

http://msdn.microsoft.com/ja-jp/library/ms181122.aspxhttp://msdn.microsoft.com/ja-jp/library/aewzkxxh(VS.90).aspx

Page 18: クエリ通知使ってみよう

通知のサブスクライブT-SQL では無理!SqlClient(ADO.NET) から登録SOAP を利用する

SQL Server って SOAP の Web サービスとして公開出来る!-> 将来的に削除される機能だから、使うなよ!http://technet.microsoft.com/ja-jp/library/ms186386.aspx

Page 19: クエリ通知使ってみよう

通知が発生するタイミングクエリ結果に含まれている行が変更されたサブスクリプションの有効期限が切れたサーバーが再起動されたクエリ通知サブスクリプションを作成できなかった (SELECT ステートメントが準拠していない等 )

サーバーの負荷が高いサブスクリプションが依存しているオブジェクトが削除または変更された

http://msdn.microsoft.com/ja-jp/library/ms188323.aspx

Page 20: クエリ通知使ってみよう

ADO.NET での利用SqlNotificationRequest

下位レベル Interface

高度な制御が可能SqlDependency

上位レベル Interface

お手軽に使える

Page 21: クエリ通知使ってみよう

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]);

Page 22: クエリ通知使ってみよう

デモWindows Form アプ

リSilverlight アプリ

Page 23: クエリ通知使ってみよう

実装時の注意点テーブルはスキーマから指定すること準拠していないクエリを指定するとエライ事になる通知イベントがひたすら呼ばれる

通知イベントは UI スレッドとは違うスレッドで実行される場合がある。UI コントロールにアクセスするには、Invoke or Dispatcher 経由で

Page 24: クエリ通知使ってみよう

どこで使う?

Page 25: クエリ通知使ってみよう

キャッシュ用途として…マスタデータ ( 頻繁に更新されない )

商品カタログとか…システムデータ

テンプレートエンジンに利用しているデータとか…

ログイン時 / 画面生成時に取得する制御用データとか…

楽観排他 のユーザービリティ向上

Page 26: クエリ通知使ってみよう

まとめ

Page 27: クエリ通知使ってみよう

変更を通知してくれる機能があるよ!

制約は インデックス付きビューと似てるよ!

ADO.NET からの利用が一般的だよ!

通知イベントは別スレッドで実行されるよ!