Erlang Mnesia:以{local_content,true}模式读取远程节点数据
是否有一种方法可以使用mnesia进行本地写入和全局读取(无需复制)。例如:节点A向其本地数据库写入数据,节点B从节点A的数据库读取数据。 除了本地存储的模式信息之外,节点B没有自己的任何数据 根据文档,Erlang Mnesia:以{local_content,true}模式读取远程节点数据,erlang,mnesia,Erlang,Mnesia,是否有一种方法可以使用mnesia进行本地写入和全局读取(无需复制)。例如:节点A向其本地数据库写入数据,节点B从节点A的数据库读取数据。 除了本地存储的模式信息之外,节点B没有自己的任何数据 根据文档,{local_content,true}似乎是我需要使用的,但是我尝试让节点B读取节点A的数据失败 我的架构和表配置如下所示: 在nodeA@ip1: net_adm:ping('nodeB@ip2'). rd(user, {name, nick}). mnesia:cr
{local_content,true}
似乎是我需要使用的,但是我尝试让节点B读取节点A的数据失败
我的架构和表配置如下所示:
在nodeA@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.
配置是否错误,或者是否可以通过其他方式执行此操作?您可能需要将节点B添加到架构的额外\u db\u节点配置内容中。如果是基于磁盘的db,则不必这样做,但在RAM中,必须让它做您想要的事情
不确定具体细节,我可能会搞不清楚该把东西放在哪里。我对记忆能力不是很有经验,但文件表明你应该这样做。我认为你不能用你提到的方式来做。另一种方法可能是对节点A进行rpc调用并以这种方式获取数据。使用mnesia从节点B读取数据是没有意义的,因为它实际上只是执行一个RPC 所以节点B应该是:
rpc:call(nodeA@ip1, mnesia, read, ....).
希望这是你[多少]需要的
编辑:
哦,我忘了提到,不需要两个节点上的模式就可以工作。这是假设节点B并不真正关心与节点A共享任何其他数据,它只是读取数据;换句话说,只需保留节点A上的所有mnesia内容,并从节点B执行RPC调用即可。谢谢。我将尝试一下,看看我得到了什么。额外的\u db\u节点没有帮助。谢谢你,真的。文档中说,对本地内容表的访问应该在本地完成。所以我认为我的问题是没有意义的。访问本地内容表应该在本地完成。使这个问题无效。