如何使用em_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 ...) 

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

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

编辑:

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

我的解决方案

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

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

使用连接池,它具有em-synchrony。 这里只使用一个连接失败,因为当MySQL查询仍在等待结果时请求来自Goliath,因为您不能在单个连接上有多个活动查询。

这样包裹连接:

 db = EventMachine::Synchrony::ConnectionPool.new(size: 2) do Mysql2::EM::Client.new end 

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

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