2010-08-13 118 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重新加載 。 僅限使用 此功能用於教育 目的。使用其他功能處理 與真正的備份。