我在使用gen_server,supervisor和mnesia時遇到問題。我有主管:http://pastebin.com/8rkfrq7D 它啓動服務器模塊啓動mnesia。我的問題是,當我寫mnesia不會與主管重啓
erl
c(superv).
superv:start_link().
//it opens fine
C^
erl
c(superv).
superv:start_link().
** exception exit: shutdown
//if i try again start_link() it is working
我明白了。我刪除了負責啓動mnesia的部分,並且它工作正常,所以我期望即時退出(通過ctrl + c)不會正確關閉mnesia。不幸的是,即使我調用mnesia:stop(),在再次調用start_link()之前它會返回異常退出。請幫我解決這個問題。
Thx for answer。我添加了停止功能:[http://pastebin.com/VziRrqEb](我也提供了數據庫初始化函數)。現在,我可以監督start_link(),然後停下來,然後再次啓動它,它就會起作用。但是如果關閉erlang shell。再次打開它並調用start_link()它再次返回異常退出:shutdown(並且顯然如果我調用(錯誤之後)它再次工作)。你能幫我解決這個問題嗎? – aragornsql
是的,我可以:)你的問題是你正在調用mnesia:create_schema()。這隻能執行一次,下次嘗試執行時,它會在init函數的某處失敗。你應該斷言你的mnesia:X調用的答案,以便你知道哪一個失敗。例如'ok = mnesia:start()'。訣竅是創建一個新的空數據庫,然後在每次重新開始時重新安裝這個數據庫。看看我提到的'FALLBACK.BUP'的東西。 –
我不確定這是否正確。我寫過這樣的代碼: case mnesia:start()of ok - > ok; {error,Reason} - > io:format(「Base start:〜p \ n」,[Reason])%,{error,Reason} end 但是不會拋出錯誤。還有什麼更多的我從init刪除create_schema /表,它仍然失敗 – aragornsql