在不使用原子的情况下创建mnesia表

时间:2015-10-28 11:25:03

标签: erlang ejabberd mnesia

我有一个要求,我需要为每个ejabberd用户创建一个mnesia表。由于用户很大并且事先不知道用户名,因此必须在运行时创建具有用户名的mnesia表。目前,这是通过动态为表名创建原子来完成的,因为 mnesia:create_table 方法使用以下代码将表名作为原子。

-record(schedule_msg, {schedule_hash, from, to, packet, pid}).

mnesia:create_table(list_to_atom(lists:concat(["schedule_msg_", From#jid.user])),
        [{disc_only_copies, [node()]}, {type, set},
         {attributes, record_info(fields, schedule_msg)}]),

http://learnyousomeerlang.com/starting-out-for-real#atoms中,建议不要动态创建原子,因为它不是垃圾收集的,原子查找表的大小是有限的。

那么如何在不使用atom的情况下创建mnesia表呢?

首先应该没有与用户数量一样多的表格。从性能的角度来看,这是一个糟糕的设计吗?

1 个答案:

答案 0 :(得分:1)

  

那么如何在不使用atom的情况下创建mnesia表?

你不能

  

首先应该没有与用户数量一样多的表格。从性能的角度来看,这是一个糟糕的设计吗?

是的,这是一个坏主意。 Mnesia表是一种有限的资源,你不想在没有很好理由的情况下创建成千上万的表。