Erlang:创建一个光盘架构

时间:2016-01-14 08:01:34

标签: erlang otp mnesia

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

如果我想要一个disc节点怎么办?我知道我可以在命令行设置-mnesia schema_location disc,但这仅在模式已经存在时有效,这意味着我应该在启动myapp之前执行一些初始化,是否有一个" OTP-ful"方式,而不从mnesia删除applications,以避免这种初始化?主要目标是转向" init-then-start"进入"开始"。

1 个答案:

答案 0 :(得分:6)

这在你的帖子中是不正确的:

  

... mnesia应该包含在关键应用程序下的应用程序资源文件中,这样如果myapp启动,mnesia就会自动启动。

您在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函数中启动它。