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
键值的应用程序不会自动启动,但它表示必须在您的应用程序启动之前启动它们。
假设我们想要创建一个依赖于mnesia
的foo
应用程序并进行一些自定义。一种方法是在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:创建磁盘模式的主要内容,如果未能解决你的问题,请参考以下文章