2

MS SQL Server 上で動作する C# WinForms アプリケーションを開発しました。今日まで、シングルトン パターンで実装された安価なキャッシング メカニズムを備えた非常に単純な自作の OR-Mapper (リフレクションを使用) を使用しています。ユーザーがトリガーした「リセット」機能があります。アーキテクチャは単純な 2 層 (クライアント、サーバー) の 3 層 (クライアント上のプレゼンテーションとロジック、サーバー上のデータ層としての MS SQL) です。

通常、約 300 行と約 30 列をロードします。これらは頻繁に変更されます (およびほとんど変更されない他のテーブルもいくつかあります)。このアプリケーションのさまざまなインスタンスがさまざまなクライアント コンピューターで実行されており、同じ 300 行が読み込まれ、ランダムな行のデータが変更されています。アプリケーションは、データベース上のデータを即座に更新します。そうする前に、整合性がチェックされるので、何か問題があればユーザーはフィードバックを得ることができます。ただし、ユーザーが画面に古い値を表示する行の一部については、最新のデータを確実に取得したい場合に、手動でキャッシュをリセットする必要があります。

アプリケーションが変更された行自体を考慮するとよいでしょう。数秒ごとに更新があります。ただし、これらの更新の一部のみが他のアプリケーションに関連しています (アクティブなフィルターに応じて...)

私が考えている解決策:

  1. 共通キャッシュで OR-Mapper を使用する (例: クラスター化されたキャッシュでの NHibernate)
    • 未解決の質問: これらの L2 キャッシュはクライアント アプリ用に作成されていますか? キャッシュの変更が発生したときに UI の更新をトリガーできますか? その他の OR-Mapper ベースのソリューション?
  2. アプリケーション サーバーを使用して別の層を実装し、ロジックをこのアプリケーション サーバーに移動します。データをキャッシュし、他のクライアントに更新されたデータを通知するロジック オブジェクトのイベントを送信するインスタンスを 1 つだけ実行します。クライアントにデータをキャッシュしないでください。
  3. ロジックレベルである種のデータ変更通知を追加します (ブロードキャストベースの通知...)
    • 未解決の質問: 既存のライブラリ? SQL Server にロードしますか?
  4. 完全に別の解決策?

ここで解決策が得られないことは承知しています。これらの解決策 (または新しい解決策) について考えてみる必要があります...ご意見ありがとうございます。

4

3 に答える 3

3

ここで私の経験を共有したいと思います。すべてのクライアントが単一の企業LAN上にある同様のシナリオで。クライアントがデータを更新するたびにネットワークBroadCastアドレスで「DataRefreshMessage」をブロードキャストするUDPクライアント(送信者/受信者)をクライアントアプリケーションに実装しました。他のすべてのクライアントは、「DataRefreshMessage」を受信するとビューを更新しました。

UDPは信頼性が低いことは承知していますが、要件に対しては十分に信頼性があり、ソリューションは完全に正常に機能しています。

于 2011-11-14T19:19:20.727 に答える
1

私はこれを自分で使用したことはありませんが、SQL Server には、以前にクエリされたデータに変更が加えられたときにアプリケーションに通知できる依存関係機能があると思います。

ただし、これらの通知をサブスクライブしているアプリケーションの数に応じて、それがどれだけうまくスケーリングされるかはわかりません。私がリンクしたそのページには、このアプローチは多数のクライアントが使用するように設計されていないというメモがあります.

于 2011-11-14T18:25:08.990 に答える
0

正直なところ、モグラの丘から山を作っているように聞こえます。300 レコードをロードするだけの場合は、データベースからデータを頻繁にリロードするだけで、キャッシュを気にする必要はありません。データセットは非常に小さいため、とにかく非常に高速になり、分散キャッシュなどを使用することによる複雑さと障害点が増えることはありません.

1 人だけがデータベースに書き込むことを確認する必要があり、その人がいつ最新のデータを書き込むかを確認する必要がある場合。ある種のデータベース ロック テーブルを実装し、その前に他の誰かが書き込みを行っているかどうかを確認できます。

于 2011-11-14T17:36:13.730 に答える