erlang - 使用 gen_server 封装一个 mnesia 表?

标签 erlang mnesia erlang-otp

我有一个用 Erlang 制作的服务器应用程序。在里面我有一个内存表
存储照片上的一些信息。本着“一切都是
过程”我决定将该表包装在 gen_server 模块中,以便gen_server模块是唯一直接访问表的模块。查询
并向该表添加信息是通过向该进程发送消息来完成的
(具有注册名称)。这个想法是会有几个客户
处理从该表查询信息。

这工作得很好,但是 gen_server模块没有状态。一切它
requires 存储在 mnesia 表中。所以,我想知道 gen_server也许是
不是封装该表的最佳模型?

我是否应该不让它成为一个过程,而只是封装表格
通过该模块中的功能?如果该模块中出现错误,则
会导致调用进程崩溃,我认为这可能会更好,因为
它只会影响单个客户,而不是现在,当它会导致gen_server进程崩溃,让每个人都无法访问表(直到
主管重新启动它)。

非常感谢任何输入。

最佳答案

我猜根据 Occam's razor不需要这个gen_server存在 , 特别是因为绝对有 无状态存储在其中。当您需要访问表(或任何其他资源)为 时,可能需要这样的过程。严格顺序 (例如,您可能希望以瓶颈为代价避免任何中止的事务)。

将对表的访问封装在 中模块是一个很好的解决方案 .它创建 没有额外的复杂性 ,同时提供适当的抽象和封装级别。

关于erlang - 使用 gen_server 封装一个 mnesia 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1437468/

相关文章:

elixir - 如果子进程达到 max_restarts,则防止 DynamicSupervisor 关闭

inheritance - Erlang 类型定义

erlang - 如何通过命令行将应用程序作为守护进程启动?

erlang - 我如何从 Erlang Pid 中获取每个部分?

Erlang unique_integer 重启后返回相同的整数

erlang - 在 mnesia 中获取和更新数据

erlang - 存储主 pipe PID

erlang - Mnesia:read、match_object、select和qlc查询的时间和空间效率

erlang - 主管是否需要启动自己的主管?

elixir - 子进程可以访问单个应用程序范围的进程