Erlang:创建一个光盘架构

Not*_* ID 5 erlang mnesia erlang-otp

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

如果我想要一个disc节点怎么办?我知道我可以-mnesia schema_location disc在命令行设置,但这只有在架构已经存在时才有效,这意味着我应该在启动myapp之前执行一些初始化,是否有"OTP-ful"方式,而不是mnesia从中移除applications,以避免这种初始化?主要目标是将"init-then-start"变为"start".

Ham*_*ani 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.
Run Code Online (Sandbox Code Playgroud)

这样它就可以创建disc模式,无论它是否是之前创建的.


注意:在此解决方案中,如果您在文件中的key mnesia下编写依赖applicationsfoo.app.src(在编译时将创建foo.app),则在启动foo应用程序时获得{error, {not_started, mnesia}}.因此,您不能这样做,让您的应用程序在其foo_app:start/2功能中启动它.