不使用原子创建 mnesia 表
Create mnesia tables without using atoms
我有一个要求,我需要为每个 ejabberd 用户创建一个 mnesia table。由于用户很大,并且事先不知道他们的用户名,因此必须在运行时创建具有用户名的 mnesia tables。目前,这是通过为 table-name 动态创建原子来完成的,因为 mnesia:create_table 方法将 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 中,建议不要动态创建原子,因为它不会被垃圾收集,并且原子查找 table 的大小有限。
那么如何在不使用 atom 的情况下创建 mnesia tables 呢?
或
首先应该没有用户数那么多table。从性能的角度来看,这是一个糟糕的设计吗?
So how to create mnesia tables without using atom's ?
你不能
There should not be as many tables as the number of users in the first place. Is it a bad design from the view of performance?
是的,这是个坏主意。 Mnesia 表是一种有限的资源,您不想在没有非常非常好的理由的情况下创建数千个。
我有一个要求,我需要为每个 ejabberd 用户创建一个 mnesia table。由于用户很大,并且事先不知道他们的用户名,因此必须在运行时创建具有用户名的 mnesia tables。目前,这是通过为 table-name 动态创建原子来完成的,因为 mnesia:create_table 方法将 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 中,建议不要动态创建原子,因为它不会被垃圾收集,并且原子查找 table 的大小有限。
那么如何在不使用 atom 的情况下创建 mnesia tables 呢?
或
首先应该没有用户数那么多table。从性能的角度来看,这是一个糟糕的设计吗?
So how to create mnesia tables without using atom's ?
你不能
There should not be as many tables as the number of users in the first place. Is it a bad design from the view of performance?
是的,这是个坏主意。 Mnesia 表是一种有限的资源,您不想在没有非常非常好的理由的情况下创建数千个。