【问题标题】:Erlang: create a disc schemaErlang:创建磁盘模式
【发布时间】:2016-04-19 11:16:58
【问题描述】:

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

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

【问题讨论】:

    标签: erlang erlang-otp mnesia


    【解决方案1】:

    这与您的帖子不正确:

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

    您在.app 文件中写入applications 键值的应用程序不会自动启动,但它表示必须在您的应用程序启动之前启动它们。


    假设我们想要创建一个依赖于mnesiafoo 应用程序并进行一些自定义。一种方法是在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 架构,无论它之前是否创建过。


    注意:在此解决方案中,如果您在 applications 键下将 mnesia 作为依赖项写入 foo.app.src 文件(在编译时将创建 foo.app),则在启动 @ 987654334@ 申请,您将获得{error, {not_started, mnesia}}。所以你不能这样做,让你的应用程序在它的foo_app:start/2 函数中启动它。

    【讨论】:

    猜你喜欢
    • 2021-11-12
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2023-03-29
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多