テーブルをメッセージキューとして使用し、SqlDependencyを使用して更新プログラムに "サインアップ"しています。私が読むどこでも、人々はそれの限界に目を向けると言っているが、彼らが何であるかを具体的に言っているわけではない。私が収集したものから、テーブルの更新頻度が非常に高い場合に問題が発生します。幸いなことに、最大で毎分10〜20の値しか見ていません。
SqlServerの他の制限/影響は何ですか?
私が見つけることができる最も完全なリスト( ここから )は次のとおりです。
追加の参照:
これに加えて、SqlDependencyを使用して変更に関する通知を受け取ることを考えている人のために、私は本番環境でこのアプローチを使用しており、問題を見つけています。問題がコードに関連しているかどうかを確認するために調べていますが、主な問題は次のとおりです。
複数の変更をすばやく連続して実行する場合、常に同じ数のイベントがコードに到達するとは限りません。私のコードでは、2つの新しいレコードが次々に挿入されると、1つの通知のみを受け取ります(最後の通知)。
追加されたレコードを知る方法はありません。したがって、新しいレコードを追加し、通知を受信するためにコードが起動した場合、コードにはその新しいレコードのIDを知る方法がないため、データベースにクエリを実行する必要があります。
SQL Service Brokerが機能しない問題を追跡するために1日を費やしました。根本的な原因は、ストアドプロシージャでデータベースを参照していました。
たとえば、次のselect
はSQL Management Studioで正常に機能します。
select [MyColumn] from [MyDatabase].[MySchema].[MyTable]
ただし、これはselectステートメントでデータベースを参照しているため、SQLサービスブローカーによって拒否され、SqlDependency
からのコールバックはSqlNotificationEventArgs e
のInvalid
で返されます。 http://msdn.Microsoft.com/en-us/library/ms189308.aspx 。
SqlDependencyに渡されるSQLを次のステートメントに変更すると、エラーがなくなりました。
select [MyColumn] from [MySchema].[MyTable]
上記の例は、SQL Service Brokerが依存するSQLステートメントに対する多くの制限の1つにすぎません。制限の完全なリストについては、 SqlDependency の制限を参照してください。
理由? SQL Service Brokerが使用するSQLステートメントは、舞台裏でデータベースへの変更について SQLトランザクションログ を監視する指示に変換されます。この監視はSQL Serverのコアで実行されるため、テーブルの変更を検出する際に非常に高速になります。ただし、この速度にはコストがかかります。SQLステートメントのみを使用することはできません。命令に変換できるステートメントを使用して、 SQLトランザクションログを監視する必要があります 。
ストアドプロシージャでnolockヒントを使用することはできません。使用しないと、依存関係は常に無効なままであるため、作成したキャッシュは永続的にデータベースを再クエリします。
with (NOLOCK)
これはドキュメントで言及されていないようです(私が知る限り)
手続きスクリプトの前に、次のSETオプションが必要です。
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
他の人は、これらのSETオプションも必要であると主張しましたが、そうではないと思います。とにかくこのように設定することをお勧めします。
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET NUMERIC_ROUNDABORT OFF
SET ARITHABORT ON
このテクノロジーに関するもう1つの大きな問題は、サブスクライバー接続にCreate Procedureアクセス許可が必要なことです。現在作業中のアプリケーションのWebサービスレイヤーは、制限付きユーザーとして実行されます。 SQLDependencyを使用して通知セットアップを取得するには、そのユーザーを開いてprocを作成する必要があります。所有権を取得する道に沿って、かなり良いステップのように思えます。
これらの制限を克服するには、SqlTableDependencyを使用してみてください。 www.sqltabledependency.itをご覧ください
Service Brokerを使用します。したがって、管理されていないSQL Azureインスタンスでは機能しません。したがって、SQL Azureを使用している場合、または使用している場合は注意してください。
https://docs.Microsoft.com/en-us/Azure/sql-database/sql-database-features
サービスブローカー
単一のデータベースとエラスティックプールでサポート:
番号
マネージドインスタンスでサポート:
はい、ただしインスタンス内のみ。 Service Brokerの違い を参照してください
すべての環境で使用できない限り、おそらく適切ではありません!