3

一部のテーブルのデータが変更されたときに通知を受け取るためにSqlDependencyを使用しています。

    private void subscribeBroker()
    {
        using (var conn = new SqlConnection(connString))
        {
            conn.Open();

            var cmd = new SqlCommand("SELECT text FROM dbo.Test");
            cmd.Connection = conn;

            var dependency = new SqlDependency(cmd);
            dependency.OnChange += dependency_OnChange;
            SqlDependency.Start(connString);

            cmd.ExecuteNonQuery();
        }
    }

    void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        //Do something...
        subscribeBroker();
    }

動作していますが、いくつか質問があります。

1)どの行が変更されたかという情報を取得する方法が見つかりませんでした。テーブル全体からすべてのデータを読み取って、何が違うのかを確認する必要があります。この情報を取得する方法はありますか?(プライマリIDなど)SqlDependencyとは異なるアプローチを使用する可能性がありますか?

2)「誰か」がデータを非常に速く変更した場合はどうなりますか。一部の変更が通知されない可能性はありますか?(通知から再度購読するまでの時間が気になります。

ありがとうございました。

4

1 に答える 1

3

約1-クエリ通知は、何かが変更されたという事実を通知します。前回から変更されたものを取得したい場合は、おそらくタイムスタンプ列を使用できます。

約2-クエリ通知は変更について通知し、その後ドロップされます。その後、再度通知をサブスクライブします。通知を削除してから作成するまでの時間は、変更に関する通知が送信されない時間です。

クエリ通知は、データが頻繁に変更されていない状況に適しています。たとえば、いくつかの現金化された分類値。つまり、いくつかのテーブルで変更をサブスクライブし、変更を待ち、変更が発生したときに最新バージョンのデータを取得します。クエリ通知もサーバーリソースを使用することを考慮する必要があります。したがって、巨大なテーブルがあり、データの小さなサブセットに変更を加えたい場合、パフォーマンスの観点から多くのクエリが影響を受ける可能性があります(インデックス付きビューなど)。

変更されたデータに基づいて何らかのアクションを実行する必要があり、各変更が重要である場合は、トリガー+サービスブローカーの方が効果的であると思います。または、必要に応じて、データキャプチャを変更します。

于 2012-10-25T08:43:41.477 に答える