gpt4 book ai didi

java - 如何选择合适的 Java 数据结构来模拟 1-n 关系映射?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:54 30 4
gpt4 key购买 nike

场景

我会尽可能简洁。基本引用这个classdiag ,我有一个管理 SocketManager 列表的外观(它管理一个 Socket 连接)。每个 SocketManager 使用唯一的 SocketUserId 登录到远程服务器。此外,每个 SocketManager 都将接受来自客户端的发往特定 Receipients 列表的消息。为了便于讨论,请将这些收件人简单地视为由名称标识的远程数据桶。

客户端将像这样发送数据:

SocketFacade facade = ...;

byte[] data = ...

facade.sendData( receipient, data );

SocketFacade 启动时,它将查询一个 mysql 表,该表返回 SocketUserIdReceipients 之间的 1-m 关系。我将使用 MultiValuedMap来表示这个 1-m 的关系。多个 SocketManager 将通过遍历 map 启动。

(1) Map< SocketUserId, List<Receipient> > 

例如假设我们有 2 个 SocketManagerSocketUserId 分别是“alice”和“tom”

            +----SocketManager1 ( "alice" ) for Receipients { "B", "C" }
|
SocketFacade
|
+----SocketManager2 ( "tom" ) for Receipients { "A", "D" }

问题

我不知道如何实现 sendData 方法。基本上我需要一种从 Receipient(例如“B”)映射到其负责的 SocketManager(例如 SocketManager1)的方法。

假设我这样做

(2) Map< SocketUserId, SocketManager >
(3) Map< Receipient, SocketUserId >
  • 我是否需要 (2) 中的值的 SoftReference?
  • 我应该直接从 Receipient 映射到 SocketManager 吗?
  • SocketFacade 还支持将改变 (1) 表示的关系的方法。如果我写入数据库,(1)、(2) 和 (3) 中的内存数据结构将需要同步更改。 SocketFacade 也必须是线程安全的。最初的想法是拥有某种发布订阅系统,其中对数据库的添加/删除将导致更改通过回调传播。

    interface Callback
    {
    void receipientAdded( Receipient r );
    void receipientDeleted( Receipient r );
    }

最佳答案

在每个 Receipient 中保留对 SocketManager 的引用。这样,您就可以避开 map (它需要更多 RAM,速度较慢并且不会增加任何值(value))。

SocketManager 中,保留Receipient 的列表。在添加和删除 Receipient 时,更新指向 SocketManager 的指针。

SocketFacade 中,您需要一个采用 SocketUserId 并返回 SocketManager 的映射。通过查询 map 中的 ID 来填充该 map 。在所有经理都存在后,将收件人添加到每个经理。这需要两个 SQL 查询。

这很容易用任何 ORM 工具进行映射。

关于java - 如何选择合适的 Java 数据结构来模拟 1-n 关系映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/887167/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com