【问题标题】:Stopping of Erlang app hangs when mnesia stopped from within the program当 mnesia 从程序中停止时,Erlang 应用程序的停止会挂起
【发布时间】:2011-03-29 11:53:22
【问题描述】:

我遇到了一个问题,我无法在我的程序中停止 mnesia 而不会导致应用程序挂起。

我目前正在我的 erlang 应用程序中进行 mnesia 的原型设计。

在我的 jaus_app.erl 文件中 start() 调用:

{atomic, ok} = mnesia:load_textfile("priv/mnesia_prototype.txt")

我的 stop() 函数调用:

mnesia:dump_to_textfile("priv/mnesia_prototype_res.txt"),
mnesia:stop(),

当我注释掉这些行并从 erlang 提示符启动和停止 mnesia 时,我能够干净地停止我的应用程序。

我不应该在完全成熟的 erlang 应用程序中使用这些原型函数吗?

肯。

【问题讨论】:

  • 发生这种情况是因为您的 stop 函数是从应用程序控制器调用的,这是一个 gen_server,但 mnesia:stop 调用 application:stop(mnesia) 并等待来自应用程序控制器的响应 - 而您陷入僵局。所以,简单的答案是“不要在那个回调函数中使用mnesia:stop”;不过,我没有更好的建议:)

标签: erlang mnesia


【解决方案1】:

通过使用 systools 创建启动文件 mnesia 在我的应用程序之前启动并在我的应用程序关闭后停止。这解决了上面 legoscia 提到的悬挂问题。启动文件的想法是由 erlang 咨询公司的 Mazen 提出的。非常感谢他的建议。

【讨论】:

    【解决方案2】:

    来自 erlang 文档:

    dump_to_textfile(文件名): 转储 mnesia 的所有本地表 系统转换成一个文本文件,然后可以 被编辑(通过普通文本 编辑器),然后重新加载 使用 mnesia:load_textfile/1。 只使用 此功能用于教育 目的。使用其他函数处理 有真实的备份。

    【讨论】:

      猜你喜欢
      • 2014-11-05
      • 1970-01-01
      • 2020-06-21
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      相关资源
      最近更新 更多