Erlang:我应该保持 dets 开放和监督吗?



我正在将数据移入和移出dets,我有一个选择:我可以:

1) 在访问之前立即打开 DETS,并在访问后立即关闭它,或者

%% Based on Armstrong, Programming Erlang, page 279
open() ->
   File = ?NAMEDB,
   case dets:open_file(?MODULE, [{file, File}, {keypos,2}]) of
      {ok, ?MODULE} ->
          io:format("dets opened:~p~n", [File]);
      {error,_Reason} ->
         io:format("cannot open dets table~n"),
         exit(eDetsOpen)
   end.
%% Open db, get record, close db, return name
name(Record) ->
   open(),
   #name{honorific=Honorific, fname=FName, mname=MName, lname=LName, suffix=Suffix} = Record, 
   close(),
   format_name([Honorific, FName, MName, LName, Suffix]).

2) 将 DET 链接到在发生崩溃时重新打开它的主管;例如,通过带有主管的Gen-Server访问DETS,如下所示:

start_link() ->
   supervisor:start_link({local, ?SERVER}, ?MODULE, []).
start_child(Value, LeaseTime) ->
   supervisor:start_child(?SERVER, [Value, LeaseTime]).
init([]) ->
   Names           = {lit_names, {lit_names, start_link, []},
                     temporary, brutal_kill, worker, [zpt_gridz_scratchpad]},
   Children        = [Names],
   RestartStrategy = {simple_one_for_one, 0, 1},
                     {ok, {RestartStrategy, Children}}.

哪个最好?还是有更好的选择?

非常感谢,

LRP

我认为这完全取决于您的使用模式。在我看来,您有以下几种选择:

    打开表格,
  1. 读/写一些东西,关闭表格。这可以与ram_file选项一起使用,以获得更高的性能,具体取决于您的用例。
  2. 打开表格一次,根据需要继续读取和写入它,然后关闭它。
  3. 在一个进程中打开表,代理通过此进程进行的所有读取和写入,然后关闭它。

第二个可能是休闲用例中最好的。事实上,多个进程可以同时打开同一个 DETS 表:

如果两个进程通过提供相同的名称和参数打开同一个表,则该表将有两个用户。如果一个用户关闭该表,该表仍保持打开状态,直到第二个用户关闭该表。

第三种情况可能是最慢的,除非你真的有充分的理由,否则不应该选择(数据需要按一定的顺序写入或针对其他数据进行原子验证)。

相关内容

  • 没有找到相关文章

最新更新