Erlang:创建磁盘模式

Posted

技术标签:

【中文标题】Erlang:创建磁盘模式【英文标题】:Erlang: create a disc schema 【发布时间】: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”。

【问题讨论】:

【参考方案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 函数中启动它。

【讨论】:

技术上你是对的,但如果你使用发布,systools uses this list to generate correct start scripts,所以实际上我不需要mnesia:start/0我自己,mnesia:change_table_copy_type/3 工作:) @NotanID 是的,使用release 是另一个自动启动依赖项的选项。

以上是关于Erlang:创建磁盘模式的主要内容,如果未能解决你的问题,请参考以下文章

使用 httpc lib 将大型 http 响应流式传输到 Erlang 中的磁盘

为啥 OCaml 模式匹配比 Erlang 弱?

为啥 Erlang 中的模式匹配记录会抛出错误

erlang - 接收循环模式匹配问题

Erlang 模式匹配顺序

C#.NetCore RabbitMQ和ErLang安装使用