我在 Goliath (eventmachine) 下将 activerecord 与 em_mysql2 一起使用。最奇怪的事情发生在我的用户模型上。当我第一次向 /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 请求似乎都工作得很好。
有谁明白为什么这种情况只发生在我的 Users 模型上并且只发生在 User.save 操作上? Active Record 是否以某种方式存储用于执行 Model.save 并重新使用它的数据库连接?
EDIT:
当我写这个问题时,我不知何故没有提到我正在使用 ActiveRecord 作为 ORM。我也没有提到我正在异步向 Mongo 数据库发送请求以获取用户身份验证信息。
我的解决方案:
事实证明,只有当 Mongo 的响应先于 MySQL 的响应返回时才会发生此错误,这会导致 MySQL 响应由与发出请求的 Fiber 不同的 Fiber 获取。由于我使用的 MySQL2 光纤实现使用光纤的 objectID 来管理连接,这似乎导致了问题。
ActiveRecord + MySql2 + Fibers + Goliath 中的总体连接池不是完全受支持的配置。 (不过从那时起可能会有一些进展)
使用连接池,它带有em-synchrony。此处仅使用一个连接会失败,因为请求来自 Goliath,而 MySQL 查询仍在等待结果,因为单个连接上不能有多个活动查询。
像这样包装连接:
db = EventMachine::Synchrony::ConnectionPool.new(size: 2) do
Mysql2::EM::Client.new
end
如果所有连接都在使用中,池会确保请求等待,直到连接可用。
不过,连接池的大小需要调整,具体取决于您的数据库可以处理的内容以及您期望的流量。我一开始提供了 5-10 左右的服务,但这是一个相对较低的流量服务,至少在开始时是这样。这让我们的联系问题消失了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)