0

テクノロジーマシンはSQLServerExpressを使用して、温度などのデータを収集します...データベースは数秒ごとに更新されます(つまり、トラフィックが少ない)。マシンとそのSQLServerは、何に対しても独立して動作する必要があります。テクノロジコンピュータ(つまりSQL Server)の電源がオフになっている場合があります。

中央のSQLServerStandard Editionは、上記のような多くのマシンからデータを収集する必要があります。

どのシナリオをお勧めしますか?

  • マシンは、テーブルが作成されるときに、テーブルの新しい各行を送信します(つまり、数秒ごとに1行)。
  • マシンは、たとえば1時間ごとにデータを送信するプロセスをアクティブにし、新しく収集されたデータを含むすべての行を送信します。
  • 他のアプローチはありますか?

Service Brokerのアイデアをよく理解していれば、要求メッセージタイプの単一の名前、応答メッセージタイプの単一の名前、契約の単一の名前があります。SQLマシン上の関連データベースには、それぞれ1つのメッセージキューと関連サービスがあります。

私はServiceBrokerを初めて使用します。チュートリアルの例は、メッセージをXMLフラグメントとして送信する方法を示しています。テーブルの行を送信するのは実際の方法ですか?SELECTコマンドの結果をXMLフラグメントに確実に変換して戻すにはどうすればよいですか?

ありがとう、ペトル

重要:関連する質問Service Broker — XMLメッセージから行を抽出する方法は?作成されました。

4

2 に答える 2

3

また、データベースが更新されるときに、挿入された行ごとに 1 つのメッセージを送信することをお勧めします (JAnis が示唆するように、トリガーからステートメントごとに 1 つのメッセージを送信することも、INSERT ステートメントが 1 つのステートメントに膨大な数の行を挿入しない場合は正常に機能します)。

1 つの大きなメッセージよりも多くの小さなメッセージを送信するほうがよい理由は、RECEIVE で 1 つの XML ペイロードを処理する方が、多くの小さな XML ペイロードを処理するよりも効率が悪いためです。

あなたがやろうとしていることと同様の展開を見てきました。High Volume Contigous Real Time Audit And ETLを参照してください。Reusing Conversationsを読むこともお勧めします。

Service Broker は、Express インスタンスのオンとオフ、または長時間の切断を非常にうまく処理します。送信されたメッセージを保持し、接続が回復すると配信します。Expressの 10 GB の最大データベース サイズ制限が、接続が回復するまで、必要な期間メッセージを保持するのに十分であることを確認する必要があります。

Service Broker が適切に処理しないのは、Express が接続するたびに異なる DNS 名として表示される場合です (自宅、オフィス、およびスターバックスから接続するラップトップを考えてください)。Service Broker はデータベース ルーティングを使用して、中央サーバーから Express インスタンスに ack を送信します。ルーティングには静的 DNS が必要です。また、Express インスタンスが中央サーバーから到達可能である (つまり、ネットワーク アドレス変換の背後にない) ことも重要です。モバイル インスタンス (前述のラップトップ) の場合、動的な名前と、ほとんどの場合 NAT の背後から接続するという事実の両方が問題を引き起こします。VPN を使用すると問題に対処できますが、面倒です。

于 2012-07-18T20:53:06.380 に答える
2

トリガーで行送信を実装すると、実際に送信が行われます (たまにではありません)。ときどき手順 (RECEIVE) をアクティブにすることで、受信側で収集されたメッセージをいつでも処理できます。

行を XML として送信するには、トリガーでステートメントを使用できます。

Declare @msg XML;
Set @msg =
    (
        Select  * from Inserted FOR XML RAW, Type
    )

そして、メッセージを送るだけです。

于 2012-07-18T14:56:10.563 に答える