2011-12-27 9 views
21

में SQLAlchemy कनेक्शन बंद करने के लिए यह एक नमूना कोड मैं चलाना चाहते है:कैसे MySQL

for i in range(1,2000): 
    db = create_engine('mysql://[email protected]/test_database') 
    conn = db.connect() 
    #some simple data operations 
    conn.close() 
    db.dispose() 

वहाँ MySQL से "बहुत अधिक कनेक्शन" त्रुटियों के बिना इस चलाने का कोई तरीका है? मुझे पहले से ही पता है कि मैं कनेक्शन को अन्यथा संभाल सकता हूं या कनेक्शन पूल कर सकता हूं। मैं सिर्फ यह समझना चाहता हूं कि sqlalchemy से कनेक्शन को सही तरीके से कैसे बंद करें। अग्रिम धन्यवाद!

+1

IMO: आपके पास दो विकल्प कवर: पूलिंग या पाश के बाहर। – xQbert

+2

आपका उदाहरण पहले से ही दिखता है। यहां "बहुत सारे कनेक्शन" नहीं हैं (चूंकि कनेक्शन लूप के अंदर खोला/बंद है) –

+0

@ मार्टिनोच भी मैं आपके कोड से "बहुत सारे कनेक्शन" त्रुटि उत्पन्न नहीं कर सकता :( – Nilesh

उत्तर

39

यहाँ कैसे सही ढंग से कि कोड लिखने के लिए है:

db = create_engine('mysql://[email protected]/test_database') 
for i in range(1,2000): 
    conn = db.connect() 
    #some simple data operations 
    conn.close() 
db.dispose() 

है, Engine कनेक्शन के लिए एक कारखाने के साथ ही कनेक्शन की एक पूल, नहीं कनेक्शन ही है। जब आप conn.close() कहते हैं, तो कनेक्शन इंजन के भीतर कनेक्शन पूल पर वापस आ गया है, वास्तव में बंद नहीं है।

आप कनेक्शन वास्तव में बंद करने के लिए हो सकता है, किया जाता है कि, जमा नहीं, NullPool के माध्यम से पूलिंग को अक्षम चाहते हैं:

from sqlalchemy.pool import NullPool 
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool) 

ऊपर Engine विन्यास के साथ, conn.close() की प्रत्येक कॉल अंतर्निहित DBAPI कनेक्शन बंद हो जाएगा।

आप वास्तव में प्रत्येक कॉल पर अलग डेटाबेस से कनेक्ट करना चाहते हैं OTOH, कि अपने hardcoded "localhost/test_database" सिर्फ एक उदाहरण है और आप वास्तव में विभिन्न डेटाबेस के बहुत सारे है, तो dispose() का उपयोग कर दृष्टिकोण ठीक है है; यह पूल से चेक आउट नहीं होने वाले प्रत्येक कनेक्शन को बंद कर देगा।

उपरोक्त सभी मामलों में, महत्वपूर्ण बात यह है कि Connection ऑब्जेक्ट close() के माध्यम से बंद है। यदि आप किसी भी प्रकार के "कनेक्शन रहित" निष्पादन का उपयोग कर रहे हैं, तो engine.execute() या statement.execute() है, ResultProxy उस निष्पादन कॉल से लौटाई गई वस्तु पूरी तरह से पढ़ी जानी चाहिए, या अन्यथा close() के माध्यम से स्पष्ट रूप से बंद होना चाहिए। एक Connection या ResultProxy जो अभी भी खुला है, हर अंतिम कनेक्शन को बंद करने से NullPool या dispose() दृष्टिकोणों को प्रतिबंधित करेगा।

+0

'निपटान()' !! मुझे इसकी आवश्यकता है सत्र को बंद करने के लिए, 'session.close()' पर्याप्त नहीं था। मैं इसे अपने अनुभव के आधार पर SQLAlchemy दस्तावेज़ में जोड़ने की अनुशंसा करता हूं, यह स्पष्ट नहीं है कि सत्र को ठीक से कैसे बंद किया जाए। – fedorqui

+0

आप करीब() को कॉल करते हैं दस्तावेज। निपटान() की आवश्यकता नहीं है और वास्तव में निपटान() स्पष्ट रूप से सामान्य SQLAlchemy उपयोग के लिए कभी भी आवश्यक नहीं है। [मेलिंग सूची] (http://groups.google) को ईमेल करने के लिए स्वतंत्र महसूस करें।com/group/sqlalchemy) आपके विशिष्ट मुद्दे के बारे में जानकारी के साथ, शायद आपने अपने सत्र पर "एसईटी" जैसे कुछ विशेष निर्देश निष्पादित किए हैं जिन्हें पूलिंग का उपयोग करते समय साफ़ नहीं किया जाता है (इसे संभालने का एक अलग तरीका है)। – zzzeek

+0

मैंने अभी एक नए प्रश्न में जानकारी पोस्ट की है: [मैं एक एसक्यूएलकेमी सत्र को सही तरीके से कैसे बंद कर सकता हूं?] (Http://stackoverflow.com/questions/21738944/how-can-i-properly-close-a-sqlalchemy- सत्र) यदि यहां आपके उत्तर देने के लिए यह ठीक है। अन्यथा मैं मेलिंग सूची के माध्यम से संपर्क करेंगे। आपका बहुत बहुत धन्यवाद! – fedorqui

4

किसी असंबंधित समस्या के लिए डेटाबेस से डिस्कनेक्ट करने के लिए समाधान निकालने का प्रयास करने की कोशिश की गई है (फोर्किंग से पहले डिस्कनेक्ट होना चाहिए)।

आपको कनेक्शन पूल से कनेक्शन invalidate की आवश्यकता है।

अपने उदाहरण में:

for i in range(1,2000): 
    db = create_engine('mysql://[email protected]/test_database') 
    conn = db.connect() 
    # some simple data operations 
    # session.close() if needed 
    conn.invalidate() 
    db.dispose()