gen_server中的数据是否会在其主管重新启动后保留?

时间:2011-07-30 04:25:25

标签: erlang otp

我有一个主管,它启动了很多gen_server。每个gen_server都有很多数据加载需要花费很多时间。我想知道错误发生的时间,存储在gen_server状态的数据及其进程dict是否会保留下次启动,所以我不需要再次启动它们?

2 个答案:

答案 0 :(得分:11)

Erlang行为的当前状态不会保存在任何地方。你必须自己照顾好。

您可以在外部(在另一个进程中,在ETS表中,数据库中等)将状态重新保存到某个位置,或者确保您的init/1函数足够智能且动态,以便能够重新创建状态启动时(恢复现有文件,根据原始输入参数重新创建一些缓存等)。

基本上,您必须定义哪些数据应该在崩溃中存在以及如何保留或重新创建它。

答案 1 :(得分:1)

如果您的应用程序中有任何数据需要保持应用程序崩溃,那么您需要将其与应用程序分离到数据库(Mnesia)或ETS/DETS tables。让gen_server状态包含 live/temporary/transient 信息,只允许它快速操作应用程序的瞬态。
一旦调用了gen_server init / 1,就让它读取配置文件或数据库以获得开始状态。通常,当您的应用程序非常依赖于服务器的最后状态时,每次进入操作gen_server状态的请求时,您都会从中提取信息并将其复制到持久存储中(并将此数据标记为先前已知状态) )。这使您的init / 1函数能够始终检查上一个/上一个状态或是否应该开始一个新状态。