如果Erlang应用程序myapp需要运行mnesia,则应在其应用程序资源文件中的mnesia键下包含applications,这样,如果启动myapp,mnesia将自动启动-默认情况下,其节点类型为opt_disc(OTP 18 )。

如果我想要一个disc节点怎么办?我知道我可以在命令行中设置-mnesia schema_location disc,但是这仅在模式已经存在的情况下有效,这意味着我应该在启动myapp之前执行一些初始化,是否有一种“OTP-ful”方式,而无需从mnesia中删除applications,以避免这种情况初始化?主要目标是将“先启动然后启动”转变为“启动”。

最佳答案

根据您的帖子,这是不正确的:



您在applications文件中作为.app键的值编写的应用程序不会自动启动,但是它说必须在启动应用程序之前启动它们。

假设我们要创建foo应用程序,该应用程序依赖于mnesia并进行了一些自定义。一种方法是在foo_app.erl文件中启动它:

-module(foo_app).
-behaviour(application).

-export([start/2, stop/1]).

start(_Type, _Args) ->
    mnesia:start().
    mnesia:change_table_copy_type(schema, node(), disc_copies),

    %% configure mnesia
    %% create your tables
    %% ...

    foo_sup:start_link().

stop(_State) ->
    ok.

这样,无论是否已创建,它都会创建disc模式。

注意:在此解决方案中,如果您在mnesia文件中的applications键下将foo.app.src写为依赖项(在编译时将创建foo.app),则在启动foo应用程序时,您会得到{error, {not_started, mnesia}}。因此,您一定不要这样做,而要让您的应用程序通过foo_app:start/2函数启动它。

关于Erlang:创建光盘模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34784355/

10-13 05:14