Эрланг: я должен держать 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) связать dets с супервизором, который повторно открывает его в случае сбоя; например, доступ к dets через gen-server с супервизором, например:

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 ответ

Я думаю, что все зависит от вашего шаблона использования. На мой взгляд, у вас есть несколько вариантов:

  1. Откройте таблицу, прочитайте / напишите что-нибудь, закройте таблицу. Это можно использовать с ram_file вариант для повышения производительности, в зависимости от вашего варианта использования.
  2. Откройте таблицу один раз, продолжайте читать и писать, пока она вам нужна, затем закройте ее.
  3. Откройте таблицу в одном процессе, прокси все чтения и записи через этот процесс, затем закройте ее.

Второй, вероятно, лучше всего подходит для случайного использования. Фактически, несколько процессов могут одновременно открывать одну и ту же таблицу DETS:

Если два процесса открывают одну и ту же таблицу с одинаковыми именами и аргументами, то в таблице будет два пользователя. Если один пользователь закрывает таблицу, она все еще остается открытой, пока второй пользователь не закроет таблицу.

Третий случай, вероятно, является самым медленным и не должен выбираться, если у вас нет веских причин (данные должны быть записаны в определенной последовательности или проверены атомарно на основе других данных).

Другие вопросы по тегам