我正在将数据移入和移出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)将主题链接到主管,该主管在发生崩溃时重新打开它;例如通过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
答案 0 :(得分:0)
我认为这完全取决于您的使用模式。在我看来,你有几个选择:
ram_file
选项一起使用,以获得更好的性能,具体取决于您的使用情况。第二个可能是休闲用例中最好的。事实上,several processes can open the same DETS table simultaneously:
如果两个进程通过提供相同的名称和参数来打开同一个表,那么该表将有两个用户。如果一个用户关闭该表,它将保持打开状态,直到第二个用户关闭该表。
第三种情况可能是最慢的,不应该选择,除非你真的有充分的理由(数据需要以某种顺序写入或者原子地与其他数据进行验证)。