我在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数据库发送请求以获取用户身份验证信息。
我的解决方案:
事实证明,这个错误发生的唯一时间是Mongo的响应在MySQL的响应之前回来,这导致MySQL响应被不同的光纤接收而不是发出请求的光纤。由于我使用的MySQL2光纤实现使用光纤的objectID来管理连接,这似乎导致了这个问题。
ActiveRecord + MySql2 + Fibers + Goliath中的整体连接池不是完全支持的配置。 (从那时起可能会有一些进展)
答案 0 :(得分:0)
使用连接池,它带有em-synchrony。这里仅使用一个连接失败,因为当MySQL查询仍在等待结果时请求来自Goliath,因为您不能在单个连接上有多个活动查询。
改为连接这样的连接:
db = EventMachine::Synchrony::ConnectionPool.new(size: 2) do
Mysql2::EM::Client.new
end
如果所有连接都在使用中,则池会确保请求等待连接可用。
需要调整连接池的大小,具体取决于数据库可以处理的内容以及您期望的流量。我从5-10左右开始,但这是一个相对较低的流量服务,至少在开始时。这让我们的联系困境消失了。