【问题标题】:mnesia table not present vs table not loadedmnesia 表不存在 vs 表未加载
【发布时间】:2011-05-06 15:31:12
【问题描述】:

如何区分架构中不存在的表和尚未加载的表?

我目前正在使用具有相对较大超时时间的 mnesia:wait_for_tables() 来检测表,但这很松散(如果表实际上需要很长时间才能启动会发生什么)并且很耗时(如果表真的没有那里)。

【问题讨论】:

    标签: erlang mnesia


    【解决方案1】:

    也许可以试试……

    lists:member(table_name, mnesia:table_info(schema, tables)).
    

    这只是一个猜测,但如果没有其他人有明确的答案,它可以作为实验的基础。

    【讨论】:

    • 这似乎对我有用。我唯一挥之不去的担心是此时可能不会加载模式表,因此为了应对这种风险,我在调用 table_info() 之前添加了 mnesia:wait_for_tables([schema], 2000)。我现在很满意。
    【解决方案2】:

    mnesia:table_info/2 可能会有所帮助。

    1. 如果事先知道表名,想知道哪些节点有数据,

      mnesia:table_info(TableName, StorageType).
      

      StorageType 应该是其中之一

      ram_copies, disc_copies or disc_only_copies.
      
    2. 或者,如果你想知道本地节点有表副本,只需

      mnesia:table_info(TableName, storage_type).
      

      如果本地节点没有副本,则返回“未知”。

    【讨论】:

    • 如果表根本不在架构中,table_info() 将引发退出异常而不是“未知”。
    • 感谢评论。我只考虑表存在于某处的情况。包括 case 表在任何地方都不存在,将 mnesia:table_info 与 catch 一起使用。
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 2019-04-10
    • 2015-05-28
    • 2018-11-21
    • 2016-05-01
    • 2023-03-11
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多