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".
从您的帖子来看,这是不正确的:
...
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下编写依赖applications项foo.app.src(在编译时将创建foo.app),则在启动foo应用程序时获得{error, {not_started, mnesia}}.因此,您不能这样做,让您的应用程序在其foo_app:start/2功能中启动它.
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |