web-dev-qa-db-ja.com

MS SQL Serverからサーバーへのプッシュ通知を取得する最良の方法

私は自分の質問に対する解決策を部分的に見つけましたが、結果に本当に満足していません。

私のアプリケーションはASP.NET MVC + MS SQL Serverで構成されています。

ケースは次のとおりです。

  1. 外部アプリケーションは、SQLデータベースに定期的にデータを保存します。 1/10秒で20〜100件のレコードを保存できます。
  2. (たとえば)保存されているアイテムの現在の合計を更新するには、SQLをバックエンドからポーリングするか、保存のたびにプッシュ通知を行う必要があります。
  3. バックエンドは通知をUIにプッシュします(これはSignalRを使用して行われます)

私はこのチュートリアル http://venkatbaggu.com/signalr-database-update-notifications-asp-net-mvc-usiing-sql-dependency/ に従って設定しました。

SqlDependency with broker serviceを使用して、SQLからプッシュ通知を取得し、OnChangeイベントを発生させます。問題は、このソリューションが非常に遅いことです。小さなデータベースでは毎秒1つのレコードしか保存されず、イベントはかなり大きな遅延で発生します。

SQLからデータ変更を取得する別のテクノロジーはありますか?または、私が使用しているソリューションには、何らかの最適化が必要ですか?

4
Mateusz Migała

あなたはプログラムを更新するためにデータベースがいつ書き込まれたかを知る必要があるという点で、技術的な問題で概念的な問題を修正しようとしています、そしてあなたはそれを達成するためにこのSqlDependencyに依存しています。誤解しないでください。SqlDependencyは状況によっては最適です。ただし、このような状況では、サーバーで大量挿入が実行されている場合は、ほぼ確実に機能します。

ライブラリーには、最初のイベントの後(または、少し遅れて最後のイベントの後)にイベントのトリガーを無効にする機能があるか、適切にスケーリングされないソリューションが存在することになります。

代替ソリューションを提供します。バックエンドタスクが書き込みを開始したとき、書き込みが終了したとき、および書き込み中の1秒ごとに、データベースがそのタスクによって書き込まれたことを示すレコードを更新します。

アプリケーションは、データベースをポーリングしてその値を(たとえば5秒ごとに)頻繁にポーリングし、書き込まれたことを示すインジケーターがある場合は、更新を実行してフラグをリセットします。この場合、実行される次のチェックは最後のチェックの1秒後にのみ行われるため、データベースが変更された場合は、より頻繁に更新されます。

チェックをより正確にする必要がある場合は、必要に応じてより頻繁にチェックすることができます。重要なのは、プログラムがチェックと更新を必要な速度でのみ実行し、追加されたすべてのレコードに対してではないことです。つまり、100件のレコードが追加された場合、プログラムデータを100回更新する必要はありません。実際に20〜100レコードあたり0.1秒かかる場合、100レコードを最大で5回更新することになります。

2
Neil

http://sqltabledependency.somee.com/ をご覧ください。挿入された削除または更新されたレコードに関する情報を含む通知をSQL Serverから受信できます。