0

.NET Winforms でレポート ビューアーを開発しました (クエリを実行して結果を表示するだけです)。

これは、レポート データベースに対して機能します。ただし、上記は、別のデータベースからデータを取得する、はるかに大きなアプリケーションの小さなサブセットです。次のようになります。

監視対象システムの状態が変化します (例: レイテンシーの増加) => イベントが SQL Server データベース (このデータベース A と呼びます) にトランザクションとして記録されます => これによりトリガーが起動され、同じイベントがレポート データベースに書き込まれます。

2 つのデータベースの違いについてはよくわかりません。異なる目標に合わせて調整されているか、2 つのデータベースには経済的または政治的な理由がある可能性があります。

とにかく、レポートデータベースはメインデータベースに「トランザクション的に依存」しているという用語が言及されました。これは正確にはどういう意味ですか?レポート データベースは、データベース A のトランザクションに完全に依存していますか? これは私にいくつかの質問を考えさせました:

1) レポート データベースにディスク領域がないのに、データベース A がまだレポート データベースに対してトリガーを起動しているという状況にどのように対処できますか? 2)キューに入れるのは良いでしょうか 2)上記にリンクされていますが、トリガーとそのデータをレポートデータベースに送信できない場合(方法はわかりませんが、概念的に...)キューに入れるとうまくいきますか?それでも、これによりシステムはリアルタイムではなくなります。

このようなセットアップでの例外処理に関する他の危険/問題はありますか?

ありがとう

4

2 に答える 2

1

このような依存関係は、実際には本番環境では非常に悪いものです。とりあえず、(リモート) データベースのトリガーと更新は、確実にパフォーマンスを低下させます。しかし、もっと重要なのは可用性の問題です。データベース A に依存するアプリケーションは、データベース B の可用性に結び付けられます。データベース B が使用できない場合、トリガーはその作業を実行できず、失敗し、アプリケーションでエラーが発生するためです。したがって、現在、データベース B の amdinsitrator(s) は、データベース A を使用するアプリケーションの操作に対応しています。

この問題には多くのアプローチがありますが、最も簡単な方法は、データベース A のパブリケーションからデータベース B のサブスクリプションを使用してトランザクション レプリケーションを展開することです。データベースBが利用できない場合、または単に遅い場合は、妨げられません。

于 2010-07-13T23:09:20.513 に答える
0

システムがリアルタイムでなければならない場合、トリガーが唯一の方法です。トリガーは完全に同期していることに注意してください。レポート データベースでの操作は正常に完了する必要があります。そうしないと、トリガーが失敗し、元のテーブルのステートメントであるトリガー内にあるため、トランザクション データベースでの操作が失敗する可能性があります。キャッチされる場合とキャッチされない場合がありますが、トランザクション データベース内のそのテーブルへの変更は発生しません。

このシナリオには正当な理由がありますが、レポート データベースがダウンした場合、トランザクション データベースは実質的に読み取り専用または悪化するため、実際にはレポート データベースに対するトランザクション データベースの依存関係が作成されます。

それは本当にあなたが望むものではありません。

データベースが同じ構造を持っている場合は、レプリケーションを確認できます。通常、レポート データベースについて考えるときは、パフォーマンス上の理由で分離されたデータの別のコピーではなく、レポート用に最適化された別の構造を持つものを考えています (これは問題ありませんが、これは基本的にハードウェアを単純に投入するだけです)。取引ユーザーを傷つけるユーザーの報告を停止する問題)。

于 2010-07-14T01:02:24.983 に答える