2011-05-26 81 views
5

我在Goliath(eventmachine)下使用active_record與em_mysql2。我的用戶模型中最奇怪的事情正在發生。當我第一次對/用戶進行POST時,它只能按預期發揮作用。當我做第二次POST時,我得到一個錯誤。如何解決'連接仍然等待結果'與em_mysql2錯誤

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數據庫發送請求來獲取用戶認證信息。

我的解決辦法:

事實證明,唯一一次從蒙戈響應來自MySQL的響應,這就造成了MySQL響應由不同拾起之前回到這個錯誤會發生很光纖比發出請求的光纖要好。由於我使用的MySQL2光纖實現使用光纖的對象ID來管理連接,這似乎導致了這個問題。

ActiveRecord + MySql2 + Fibers + Goliath中的整體連接池不是完全受支持的配置。 (雖然自那時以來可能會有一些進展)

回答

0

使用一個連接池,它與em-synchrony一起提供。只使用一個連接失敗,因爲請求來自Goliath,而MySQL查詢仍在等待結果,因爲您無法在單個連接上進行多個活動查詢。

裹這樣的替代連接:

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

池可以確保請求等待,直到連接變爲可用,應該都連接在使用。

連接池的大小需要調整,具體取決於您的數據庫可以處理什麼以及您期望的流量。我從5點到10點開始,但是這是一個相對較低的交通服務,至少在一開始就是這樣。這使我們的連接困境消失。

+0

謝謝!通常這是對這個問題的合理回答。不幸的是,自從我轉移到另一個項目以來,我無法在此時驗證它的正確性。如果其他人可以驗證,我很樂意接受答案。哦!你在使用ActiveRecord嗎? – radixhound 2011-11-15 22:06:32

+0

不,不使用ActiveRecord,但是續集。那裏的故事很相似,所以我懷疑解決方案是一樣的。 – roidrage 2011-11-16 16:30:13

+0

@radixhound如果使用ActiveRecord,將會如何解決它 – Anand 2011-12-12 10:57:56