2011-05-26 13 views
5

Goliath (eventmachine) altında em_mysql2 ile activerecord kullanıyorum. Kullanıcı modelimle en garip şey oluyor. İlk kez bir POST/kullanıcılara yaptığımda, her şey beklendiği gibi çalışıyor. İkinci bir POST yaptığımda bir hata alıyorum.'bağlantı hala bir sonuç için bekliyor' hatası 'em_mysql2 ile hata

Mysql2::Error: This connection is still waiting for a result, try again once you have the result: INSERT INTO `users` (... and so on ...) 

Modellerimin veya rotalarımın herhangi biri için bu gerçekleşmez. Ben db bağlantısı, diğer isteklerde aynı hatayı göreceğini ama nope bozuk bir durumda ise - tüm diğer DB güncelleştirme ve GET istekleri sadece iyi çalışıyor gibi görünüyor.

Herkes bunun yalnızca Kullanıcılarım modelim ve yalnızca bir User.save eylemi için nasıl olabileceğini anlıyor mu? Aktif kayıt bir şekilde Model.save yapmak için kullanılan DB bağlantısını saklar ve yeniden kullanır mı?

DÜZENLEME:

ben bir şekilde ben ORM ActiveRecord kullanıyordum bu soruyu yazdığında söz başarısız oldu. Kullanıcı kimlik doğrulama bilgilerini almak için eş zamanlı olarak bir Mongo veritabanına bir istek gönderdiğimi belirtmedim.

Çözümümün:

Bu çıkıyor Mongo gelen tepki sırt MySQL tepkisi farklı tarafından alınmayı neden MySQL dan yanıt, daha önce geldiğinde oluşacak bu hata olan tek zaman bu Fiber, istekte bulunandan daha fazla. Kullandığım MySQL2 fiber uygulaması, bağlantıları yönetmek için fiber'in objectID'sini kullandığından, bu sorunlara neden olmuş gibi görünüyor.

ActiveRecord + MySql2 + Fibres + Goliath'daki genel bağlantı havuzu tam olarak desteklenen bir yapılandırma değildi. (O zamandan bu yana bazı ilerlemeler olabilir)

cevap

0

Eşzamanlama ile birlikte gelen bir bağlantı havuzu kullanın. Tek bir bağlantıda birden fazla etkin sorguya sahip olamayacağından, MySQL sorgusu hala bir sonuç beklerken Goliath'dan gelen talepler nedeniyle sadece bir bağlantının kullanılması başarısız olur. artık şöyle

Wrap bağlantısı:

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

havuz bir bağlantı kullanılabilir hale gelinceye kadar istekleri Tüm bağlantıların kullanımda olmalıdır bekleyin emin kılar.

Veritabanınızın ne işleyebileceğini ve ne kadar trafik beklediğinize bağlı olarak bağlantı havuzunun boyutunun ayarlanması gerekir. 5-10 civarında bir şeyle başladım ama en azından başlangıçta nispeten düşük bir trafik servisi oldu. Bu bizim bağlantı sorunlarımızı ortadan kaldırdı.

+0

Teşekkürler! Genel olarak bu soruya makul bir cevaptır. Ne yazık ki farklı bir projeye geçtiğimden bu yana doğruluğunu doğrulayamıyorum. Birisi doğrulayabilirse, cevabı kabul etmeyi çok isterim. Oh! ActiveRecord kullanıyor musunuz? – radixhound

+0

Hayır, ActiveRecord kullanmıyor, ancak Sequel. Oldukça benzer bir hikaye var, bu yüzden çözümün aynı olduğundan şüpheliyim. – roidrage

+0

@radixhound ActiveRecord – Anand

İlgili konular