2011-05-26 12 views
5

के साथ त्रुटि मैं goliath (eventmachine) के तहत em_mysql2 के साथ activerecord का उपयोग कर रहा हूं। मेरे उपयोगकर्ता मॉडल के साथ सबसे अजीब चीज हो रही है। जब मैं पहली बार/उपयोगकर्ताओं को एक पोस्ट करता हूं, तो यह सब केवल अपेक्षित के रूप में काम करता है। जब मैं दूसरा पोस्ट करता हूं तो मुझे एक त्रुटि मिलती है।'कनेक्शन अभी भी परिणाम के लिए इंतजार कर रहा है' को हल करने के लिए कैसे करें 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 ...) 

यह मेरे किसी भी मॉडल या मार्गों के लिए नहीं होता है। मुझे लगता है कि अगर डीबी कनेक्शन एक गड़बड़ स्थिति में है कि मुझे अन्य अनुरोधों पर एक ही त्रुटि दिखाई देगी लेकिन नहीं - अन्य सभी डीबी अपडेट और जीईटी अनुरोध ठीक काम करने लगते हैं।

क्या कोई यह समझता है कि यह कैसे है कि यह केवल मेरे उपयोगकर्ता मॉडल के लिए और केवल User.save कार्रवाई के लिए हो सकता है? क्या सक्रिय रिकॉर्ड किसी भी तरह से डीबी कनेक्शन को संग्रहीत करता है जिसे यह मॉडल.save करने के लिए उपयोग किया जाता है और इसका पुन: उपयोग करता है?

संपादित करें:

मैं किसी भी तरह जब मैं इस सवाल है कि मैं ORM के रूप में उपयोग कर रहा था ActiveRecord लिखा उल्लेख करने में विफल। मैं यह भी उल्लेख करने में असफल रहा कि मैं उपयोगकर्ता प्रमाणीकरण जानकारी लाने के लिए एक मोंगो डेटाबेस को अतुल्य रूप से अनुरोध भेज रहा था।

मेरे समाधान:

ऐसा लगता है कि केवल समय इस त्रुटि घटित होता था जब मोंगो से प्रतिक्रिया वापस जिसके कारण MySQL की प्रतिक्रिया अलग द्वारा उठाया जा करने के लिए MySQL से प्रतिक्रिया, पहले आया था अनुरोध करने वाले व्यक्ति से फाइबर। चूंकि MySQL2 फाइबर कार्यान्वयन मैं कनेक्शन का प्रबंधन करने के लिए फाइबर के ऑब्जेक्ट आईडी का उपयोग कर रहा था, ऐसा लगता है कि इस मुद्दे का कारण बन गया है।

ActiveRecord + MySql2 + फाइबर + गोलीथ में कुल मिलाकर कनेक्शन पूलिंग पूरी तरह से समर्थित कॉन्फ़िगर नहीं था। (हालांकि उस समय से कुछ प्रगति हो सकती है)

उत्तर

0

एक कनेक्शन पूल का उपयोग करें, जो एम-सिंक्रनाइज़ के साथ आता है। केवल एक कनेक्शन का उपयोग करना विफल रहता है क्योंकि अनुरोध Goliath से आते हैं जबकि एक MySQL क्वेरी अभी भी परिणाम के लिए प्रतीक्षा कर रही है, क्योंकि आपके पास एक कनेक्शन पर कई सक्रिय क्वेरी नहीं हो सकती हैं।

लपेटें यह बजाय तरह कनेक्शन:

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

पूल सुनिश्चित करें कि अनुरोध जब तक प्रतीक्षा करें एक कनेक्शन उपलब्ध हो जाता, सभी कनेक्शनों उपयोग में होना चाहिए बनाता है।

कनेक्शन पूल का आकार ट्यून किया जाना चाहिए, भले ही आपका डेटाबेस संभाल सकता है और आप कितनी यातायात की उम्मीद कर रहे हैं। मैंने लगभग 5-10 के आसपास कुछ शुरू किया लेकिन कम से कम शुरुआत में यह अपेक्षाकृत कम यातायात सेवा थी। इससे हमारे कनेक्शन की समस्याएं दूर हो गईं।

+0

धन्यवाद! आम तौर पर यह सवाल का उचित जवाब है। दुर्भाग्यवश मैं इस समय अपनी शुद्धता को मान्य नहीं कर सकता क्योंकि मैं एक अलग परियोजना में स्थानांतरित हुआ था। अगर कोई और मान्य कर सकता है, तो मुझे जवाब स्वीकार करना अच्छा लगेगा .. ओह! क्या आप ActiveRecord का उपयोग कर रहे हैं? – radixhound

+0

नहीं, ActiveRecord का उपयोग नहीं, लेकिन Sequel। वहां बहुत ही समान कहानी है, इसलिए मुझे संदेह है कि समाधान वही है। – roidrage

+0

@radixhound ActiveRecord – Anand

संबंधित मुद्दे