Goliath (eventmachine) の下で em_mysql2 で activerecord を使用しています。User モデルで最も奇妙なことが起こっています。初めて /users に POST を実行すると、期待どおりに機能します。2 番目の POST を実行すると、エラーが発生します。
Mysql2::Error: This connection is still waiting for a result, try again once you have the result: INSERT INTO `users` (... and so on ...)
これは、他のモデルやルートでは発生しません。データベース接続がめちゃくちゃな状態にある場合、他のリクエストでも同じエラーが表示されると思いますが、いいえ-他のすべてのDB更新およびGETリクエストは正常に機能しているようです。
これが私の Users モデルでのみ User.save アクションでのみ発生する可能性があることを理解している人はいますか? アクティブなレコードは、Model.save を実行するために使用した DB 接続を保存して再利用しますか?
編集:
この質問を書いたとき、ActiveRecord を ORM として使用していたことに言及できませんでした。また、ユーザー認証情報を取得するために Mongo データベースにリクエストを非同期的に送信していたことにも言及しませんでした。
私の解決策:
このエラーが発生するのは、MySQL からの応答よりも前に Mongo からの応答が戻ってきたときだけであり、MySQL の応答が、要求を行ったファイバーとは異なるファイバーによって取得されたことが判明しました。私が使用していた MySQL2 ファイバーの実装では、ファイバーの objectID を使用して接続を管理していたため、問題が発生したようです。
ActiveRecord + MySql2 + Fibers + Goliath の全体的な接続プールは、完全にサポートされている構成ではありませんでした。(その時から多少の進歩はあるかもしれませんが)