当mnesia从程序内停止时,Erlang应用程序的停止挂起

当mnesia从程序内停止时,Erlang应用程序的停止挂起,erlang,mnesia,Erlang,Mnesia,我遇到了一个问题,我无法在程序中停止mnesia而不会导致应用程序挂起 我目前正在我的erlang应用程序中进行mnesia的原型制作 在我的jaus_app.erl文件中,start()调用: My stop()函数调用: mnesia:dump_to_textfile("priv/mnesia_prototype_res.txt"), mnesia:stop(), 当我注释掉这些行,并从erlang提示符启动和停止mnesia时,我就能够完全停止我的应用程序 我不应该在成熟的erlang应

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

我目前正在我的erlang应用程序中进行mnesia的原型制作

在我的jaus_app.erl文件中,start()调用:

My stop()函数调用:

mnesia:dump_to_textfile("priv/mnesia_prototype_res.txt"),
mnesia:stop(),
当我注释掉这些行,并从erlang提示符启动和停止mnesia时,我就能够完全停止我的应用程序

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

肯。

来自erlang文档:

转储到文本文件(文件名): 转储mnesia的所有本地表 系统转换成一个文本文件,然后 (通过普通文本)进行编辑 编辑器),然后重新加载 使用mnesia:load_textfile/1仅限使用 此功能用于教育 目的。使用其他函数来处理 有真正的备份


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

之所以会出现这种情况,是因为应用程序控制器调用了
stop
函数,而应用程序控制器是
gen\u服务器
,但是
mnesia:stop
调用
application:stop(mnesia)
,并等待应用程序控制器的响应,并且出现死锁。因此,简单的答案是“不要在回调函数中使用
mnesia:stop
”;不过,我没有更好的建议:)
mnesia:dump_to_textfile("priv/mnesia_prototype_res.txt"),
mnesia:stop(),