如何使用em_mysql2解决"连接仍在等待结果"错误

rad*_*und 5 ruby activerecord eventmachine mysql2

我在Goliath(eventmachine)下使用em_mysql2的activerecord.最奇怪的事情发生在我的用户模型上.当我第一次对/ users进行POST时,它只能按预期找到.当我做第二次POST时,我收到错误.

Mysql2::Error: This connection is still waiting for a result, try again once you have the result: INSERT INTO `users` (... and so on ...)
Run Code Online (Sandbox Code Playgroud)

对于我的任何其他模型或路线,都不会发生这种情况.我假设如果数据库连接处于混乱状态,我会在其他请求上看到相同的错误但是没有 - 所有其他数据库更新和GET请求似乎都运行正常.

有谁知道这只会发生在我的用户模型和仅用于User.save操作的情况下?活动记录是否以某种方式存储它用于执行Model.save的数据库连接并重新使用它?

编辑:

当我写这个问题时我不知道提到我使用ActiveRecord作为ORM.我也没有提到我异步向Mongo数据库发送请求以获取用户身份验证信息.

我的解决方案

事实证明,这个错误发生的唯一时间是来自Mongo的响应在MySQL的响应之前回来,这导致MySQL响应被不同的光纤接收而不是发出请求的光纤.由于我使用的MySQL2光纤实现使用光纤的objectID来管理连接,这似乎导致了这个问题.

ActiveRecord + MySql2 + Fibers + Goliath中的整体连接池不是完全支持的配置.(从那时起可能会有一些进展)

roi*_*age 0

使用连接池,它带有em-synchrony。此处仅使用一个连接会失败,因为请求来自 Goliath,而 MySQL 查询仍在等待结果,因为单个连接上不能有多个活动查询。

像这样包装连接:

db = EventMachine::Synchrony::ConnectionPool.new(size: 2) do
  Mysql2::EM::Client.new
end
Run Code Online (Sandbox Code Playgroud)

如果所有连接都在使用中,池会确保请求等待,直到连接可用。

不过,连接池的大小需要调整,具体取决于您的数据库可以处理的内容以及您期望的流量。我一开始提供了 5-10 左右的服务,但这是一个相对较低的流量服务,至少在开始时是这样。这让我们的联系问题消失了。