我有一个要求,我需要为每个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表呢?
或
首先应该没有与用户数量一样多的表格。从性能的角度来看,这是一个糟糕的设计吗?
答案 0 :(得分:1)
那么如何在不使用atom的情况下创建mnesia表?
你不能
首先应该没有与用户数量一样多的表格。从性能的角度来看,这是一个糟糕的设计吗?
是的,这是一个坏主意。 Mnesia表是一种有限的资源,你不想在没有很好理由的情况下创建成千上万的表。