44

私の現在の状況は、新しいデータがデータベース テーブルに到着したときに通知する必要があるアプリケーションを持っているということです。データは外部ソースからのものです (私には制御できません。これが唯一の統合オプションです)。新しいデータが到着すると、アプリケーションは特定のアクションを実行する必要があります。基本的には、新しいデータのクエリ、処理、結果のローカル テーブルへの挿入などです。

データはリアルタイムで処理されることが予想されるため、可能であればポーリングは避けたいと考えています。とはいえ、データが失われないようにすることが最優先事項です。

私の質問:

  1. SqlDependency は一般的に信頼できると考えられていますか?
  2. 競合状態について心配する必要はありますか? たとえば、ある変更を別の変更が到着したときに処理している場合などです。
  3. データベースが再起動されるとどうなりますか? アプリが回復して変更の受信を再開するか、または通知を定期的に再サブスクライブする何らかのフェイルセーフ タイマーが必要か?
  4. このトピックについて読んだ記事のほとんどは、SQL Server 2005 に関するものでした。SQL Server 2008 R2 を使用しています。SqlDependency よりも優先される新しい手法はありますか?
  5. (編集) また、アプリケーションがダウンした場合はどうなりますか? 起動時に欠落したデータを照会する必要があると思いますか?
4

2 に答える 2

55

1) はい、意図された目的 (キャッシュの無効化) が正しく行われるため、信頼できると思います。

2) いいえ。これが、クエリを発行することによってのみサブスクライブできる理由です。これにより、データの取得と新しい更新の通知との間に競合がなくなります。

3) データベース (またはインスタンス) の再起動は、保留中のすべてのクエリ通知に のSqlNotificationInfo値を通知しますRestartSqlDependency がどのようにクエリ通知に基づいているかを読んで、理解を深めてください。SqlDependencyデータベースへのオープン接続を常に維持するため、明示的なクエリ通知の前であっても、データベースが使用できないことが検出されますSqlDependency

4) いいえ。これについては、さらに下に...

5) 「欠落データ」はありません。クエリ通知 (したがって SqlDependency) は、どのデータが変更されたかについて通知しません。変更されたことを通知するだけです。何が変更されたかを確認するために、常に戻ってすべてのデータを読み返す必要があります (質問/回答の 2 を参照してください)。新しく開始されたアプリケーションは、開始するデータをまだクエリしていないため、通知される変更はありません。最初にデータを照会した後でのみ、通知を受け取ることができます。

問題の説明から、クエリ通知が必要だとは思いません。アプリケーションが実行されていなくても、変更がいつ発生したかに関係なく、変更に対応したいと思われます。これは確かにキャッシュの無効化ではなく、変更の追跡です。したがって、 Change Data CaptureChange Trackingなどの変更追跡テクノロジを展開する必要があります。どちらも SQL Server 2008 以降のみです (SQL Server 2005 では使用できません)。SQL Server 2005 では、処理しようとしているのと同じ問題 (変更の検出、新しいデータの各行への対応) を処理するために、トリガーを配置し、 Service Brokerのメッセージをキューに入れることは珍しくありません。

于 2012-09-17T06:58:25.387 に答える
5

.net 開発者の観点から言えば、キャッシュの無効化に使用したいだけで、それは本当に苦痛であり、完全に信頼できるわけではありません。

セットアップとトラブルシューティングは特に苦労しました。ある環境では正常に動作するようになりましたが、別の環境では動作しませんでした。その理由を突き止めるのは難しく、時間がかかりました。

すべてが実行されている場合でも、完全に信頼できるわけではありません。SQL Server の負荷が高く、再起動や通知が再開しないという既知の問題がある場合、SQL Server は通知をドロップする可能性があります。 -server-restarts .

あなたが望むことを行い、面倒が少ない代替技術があれば、私は避けたいと思います.

于 2014-01-20T14:56:11.583 に答える