シナリオ1-nリレーショナルマッピングをモデル化するために適切なJavaデータ構造を選択する方法は?
私は可能な限り簡潔になるつもりです。基本的にはclassdiagを参照して、私はSocketManager(1つのソケット接続を管理する)のリストを管理するファサードを持っています。各SocketManagerは、一意のSocketUserIdを使用してリモートサーバーにログインします。さらに、それぞれSocketManagerは、受信者の特定のリスト宛のクライアントからのメッセージを受け入れます。説明のために、受信者は、名前で識別されるリモートデータバケットと同じように考えてください。
クライアントは、このようなデータを送信する。
SocketFacade facade = ...;
byte[] data = ...
facade.sendData(receipient, data);
場合SocketFacade開始は、SocketUserIdとReceipients間の1-Mの関係を返すMySQLのテーブルを照会します。私はMultiValuedMapを使用して、この1-m関係を表します。複数のSocketManagerは、マップを反復処理することで開始されます。
(1) Map< SocketUserId, List<Receipient> >
私たちは、それぞれSocketUserIdの "アリス" & "トム" と2 SocketManager秒を持っていると仮定し
+----SocketManager1 ("alice") for Receipients { "B", "C" }
|
SocketFacade
|
+----SocketManager2 ("tom") for Receipients { "A", "D" }
質問私はのsendDataメソッドを実装する方法のように結合しています
。基本的には、受信者(例:「B」)から責任者(、SocketManager)にマッピングする方法が必要です(例:SocketManager1)。
だが、私はこの
(2) Map< SocketUserId, SocketManager >
(3) Map< Receipient, SocketUserId >
- を行うとしましょう、私は(2)の値のためにSoftReferenceが必要でしょうか?
- 受信者から直接にマップする必要があります。SocketManager?
SocketFacadeは、(1)で表される関係を変更する方法もサポートしています。データベースに書き込むと、(1)、(2)、&(3)のメモリ内データ構造が同期して変更する必要があります。 SocketFacadeもスレッドセーフでなければなりません。最初のアイデアは、DBへの追加/削除によって変更がコールバックを介して伝播するような、ある種のパブリッシュ・サブスクライブ・システムを持つことです。
interface Callback { void receipientAdded(Receipient r); void receipientDeleted(Receipient r); }
「受信者」ではなく「受信者」です。コードのスペルミスはバグの厄介な原因です。 – Svante
OK。ありがとう。私の悪い。 – ashitaka