2010-08-13 127 views
5

我遇到了一个问题,我无法在程序中停止mnesia而不会导致应用程序挂起。当mnesia从程序中停止时,停止Erlang应用程序挂起

我目前正在做我的erlang应用程序中mnesia的原型。

在我jaus_app.erl文件中的开始()调用:

{atomic, ok} = mnesia:load_textfile("priv/mnesia_prototype.txt") 

我stop()函数调用:

mnesia:dump_to_textfile("priv/mnesia_prototype_res.txt"), 
mnesia:stop(), 

当我注释掉这些行,并开始从停止的Mnesia erlang提示,我可以干净地停止我的应用程序。

我不应该在完全成熟的erlang应用程序中使用这些原型函数吗?

Ken。

+5

发生这种情况的原因是您的'stop'函数是从应用程序控制器调用的,该函数是'gen_server',而mnesia:stop'调用'application:stop(mnesia)',并等待来自应用程序控制器的响应 - 你有一个僵局。所以,简单的答案是“不要在该回调函数中使用mnesia:stop'”;我没有更好的建议,但:) – legoscia 2010-08-13 15:05:41

回答

2

通过使用systools创建启动文件mnesia在我的应用程序之前启动,并在关闭应用程序后停止。这就解决了上面的腿痛指出的悬挂问题。启动文件的想法是由erlang咨询公司的Mazen提出的。非常感谢他的建议。

1

从二郎文档:

dump_to_textfile(文件名): 转储一个Mnesia 系统的所有本地表到一个能够 可以编辑的文本文件(用普通文本 编辑的装置)然后用mnesia:load_textfile/1重新加载 。 仅限使用 此功能用于教育 目的。使用其他功能处理 与真正的备份。