【发布时间】:2011-12-05 23:14:16
【问题描述】:
我创建了一个将消息记录到 mysql 数据库的日志模块,当前代码位于此处: https://github.com/amiadogroup/mod_log_chat_mysql5/blob/master/src/mod_log_chat_mysql5.erl
当前代码的问题是,有时连接会关闭,因此模块不再工作。 正如您在代码中看到的,我将 DBRef 存储在 ets 表中,这并不是真正的好方法。
我向 erlang 邮件列表询问了这个问题,他们建议我将 DB Connection 作为模块自己的子进程进行。这将使模块能够在连接关闭时优雅地重新启动连接。
现在我的问题是:如何使用 gen_server 和/或 gen_mod 实现这个子进程?
我需要创建两个文件还是可以在同一个文件中创建?
有什么例子可以说明我如何做到这一点吗?
编辑: 正如您在链接的 github 存储库中看到的,我更新了代码,它现在可以工作了,哇! 查看 mod_Archive 代码对我有很大帮助,虽然我没有决定升级我的 ejabberd 版本。
我现在遇到了另一个相关的问题。在代码中,您会看到我使用“SET NAMES UTF8”进行了初始查询,以防止消息出现乱码。如果 gen_server 重新连接,这似乎不会再次完成。是否有任何钩子可以在重新连接时调用,以便每次都完成 UTF8 查询?
编辑#2: 现在我切换到 Emysql (https://github.com/Eonblast/Emysql),它通过直接在连接上指定编码来开箱即用。 代码在github上。
感谢您的帮助, 迈克尔
【问题讨论】:
标签: concurrency erlang ejabberd