6

有没有办法使用 mnesia 进行本地写入和全局读取(无需复制)。例如:节点 A 写入其本地 DB,节点 B 从节点 A 的 DB 中读取。除了本地存储的模式信息之外,节点 B 没有任何自己的数据。

根据文档,{local_content, true}似乎是我需要使用的,但我试图让节点 B 读取节点 A 的数据没有成功。

我的架构和表配置如下所示:

在节点A@ip1 上:

    net_adm:ping('nodeB@ip2').
    rd(user, {name, nick}).
    mnesia:create_schema([node()|nodes()]).
    mnesia:start().
    mnesia:create_table(user, [ {local_content, true}, 
                                {disc_copies, [node()]}, 
                                {attributes,record_info(fields, user) }]).

%% insert data and list rows on nodeA 
%% WORKS

在 nodeB@ip2 上:

    mnesia:start().
    %% code to list rows from user table on nodeA 
    %% throws an ERROR saying table does not exist.

配置错误还是可以通过其他方式完成?

4

2 回答 2

1

我不认为你可以按照你提到的方式做到这一点。另一种方法可能是对节点 A 进行 rpc 调用并以这种方式获取数据。使用 mnesia 从节点 B 读取是没有意义的,因为它本质上只是执行 RPC。

所以节点 B 应该是:

rpc:call(nodeA@ip1, mnesia, read, ....).

希望这是你[有点]需要的。

编辑:哦,我忘了提到你不需要两个节点上的模式才能工作。这是假设节点 B 并不真正关心与节点 A 共享任何其他数据,它只是读取它;换句话说,只需将所有 mnesia 内容保留在节点 A 上,然后从节点 B 进行 RPC 调用。

于 2010-03-08T09:11:14.773 回答
0

您可能需要将节点 B 添加到架构的 extra_db_nodes 配置中。如果它是基于磁盘的数据库,则不必这样做,但在 RAM 中,必须让它做你想做的事。

不确定具体细节,我可能会混淆将东西放在哪里。我对 mnesia 不太熟悉,但文档表明你应该这样做。

于 2010-03-04T17:21:56.373 回答