5

同じモデル/オブジェクトを共有/同期したいクライアントとサーバーがあるとします。モデルはお互いを指しており、クライアントとサーバーの間で送信/シリアル化された後も同じオブジェクトを指し続ける必要があります。私の現在のソリューションは、おおよそ次のようになります。

class Person {
    static Map<Integer,Person> allPeople;
    int myDogId;

    static Person getPerson(int key){
        return allPeople.get(key);
    }

    Dog getMyDog() {
        return Dog.getDog(myDogId);
    }
}

class Dog {
    static Map<Integer,Dog> allDogs;
    int myOwnersId;

    static Dog getDog(int key) {
        return allDogs.get(key);
    }

    Person getMyOwner() {
        return Person.getPerson(myOwnersId);
    }
}

しかし、私はこのソリューションにあまり満足していません。フィールドは整数などです。これもかなり一般的な問題です。ここで探しているのは、この問題の名前、パターン、一般的な解決策、またはライブラリ/フレームワークです。

4

3 に答える 3

2

ここには 2 つの問題があります。

  • クライアントとサーバーでデータを複製していますか (もしそうなら、それはなぜですか?) それとも、どちらか一方、またはデータベース エージェントがモデルを保持していますか?
  • 各エージェントはどのように (その) モデルにアクセスしますか?

モデルが 1 つのエージェント (クライアント、サーバー、データベース) によってのみ保持されている場合、他のエージェントは抽象モデル エンティティ (たとえば、あなたが行ったように整数として実装されるかもしれないモデル要素識別子)。

誰がモデルを所有しているか (1 つまたはすべて) に関係なく、各モデルは自然に実装できます。通常の実装では、あたかもエージェント間で共有することを考えずにコーディングしたかのように、通常のオブジェクト参照を使用して、各オブジェクトが他のオブジェクトを参照するだけであり、実際に行ったこととは異なります。

各オブジェクトに objectid を関連付けることはできますが、アプリケーション コードでそれを使用する必要はありません。モデルのリモート コピーを参照する場合にのみ必要です。この objectid が特別なフィールド、ハッシュ テーブルとして各オブジェクトに関連付けられているか、オンザフライで計算されるかは、実装の詳細にすぎません。

これを処理する 1 つの方法は、オンザフライで objectid を計算することです。モデル全体に​​正規のスパニング ツリーがある場合は、これを行うことができます。この場合、objectid は、スパニング ツリーのルートからオブジェクトの場所までの「単なる」パスです。スパニング ツリーがない場合、または計算コストが高すぎる場合は、オブジェクトの作成時に objectid を割り当てることができます。

あなたが提案したように、複製された分散モデルの本当の問題は、両方のエージェントがそれを更新して最新の状態に保つことです。一方が他方と同時にオブジェクトを作成 (objectid の割り当て) するのを防ぐにはどうすればよいですか? ただし、作成されるオブジェクトは同じ objectid で異なります。モデルの同期を維持するには、リモート ロックとシグナリングが必要です (これは、複数の CPU の「キャッシュの一貫性」と同じ問題です。各オブジェクトがキャッシュ ラインのように機能していると考えてください)。これを解決する一般的な方法は、誰がマスター コピー (おそらくモデル全体、おそらくモデル内の個々のオブジェクト) を保持しているかを指定し、クエリ、読み取り、変更を意図した読み取り、または書き込みを発行して、 「一意の」モデル全体が更新されること。

于 2011-04-11T07:55:35.787 に答える
0

私が知っている唯一の解決策は、完全な構造、つまり犬と人をネットワーク経由で送信することです。次に、ネットワークの反対側にある正しいコピーを指すようになります。ただし、このソリューションの実装は多くの状況に依存します。たとえば、包含関係がツリーを定義している場合、サイクルのあるグラフの場合とは異なる方法でこの問題に取り組むことができます。

詳細については、これをご覧ください。

于 2011-04-11T07:33:57.050 に答える
0

これにはプロキシパターンを使用できると思います。

于 2011-04-21T06:22:29.497 に答える