यहाँ कैसे सही ढंग से कि कोड लिखने के लिए है:
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()
दृष्टिकोणों को प्रतिबंधित करेगा।
IMO: आपके पास दो विकल्प कवर: पूलिंग या पाश के बाहर। – xQbert
आपका उदाहरण पहले से ही दिखता है। यहां "बहुत सारे कनेक्शन" नहीं हैं (चूंकि कनेक्शन लूप के अंदर खोला/बंद है) –
@ मार्टिनोच भी मैं आपके कोड से "बहुत सारे कनेक्शन" त्रुटि उत्पन्न नहीं कर सकता :( – Nilesh