उस कोड को सही तरीके से लिखने का तरीका यहां बताया गया है:
db = create_engine('mysql://example@sqldat.com/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://example@sqldat.com/test_database', poolclass=NullPool)
उपरोक्त के साथ Engine कॉन्फ़िगरेशन, प्रत्येक कॉल करने के लिए conn.close() अंतर्निहित DBAPI कनेक्शन को बंद कर देगा।
यदि OTOH आप वास्तव में भिन्न . से जुड़ना चाहते हैं प्रत्येक कॉल पर डेटाबेस, यानी आपका हार्डकोडेड "localhost/test_database" सिर्फ एक उदाहरण है और आपके पास वास्तव में बहुत सारे अलग-अलग डेटाबेस हैं, फिर dispose() . का उपयोग करके दृष्टिकोण ठीक है; यह हर उस कनेक्शन को बंद कर देगा जिसे पूल से चेक आउट नहीं किया गया है।
उपरोक्त सभी मामलों में, महत्वपूर्ण बात यह है कि Connection ऑब्जेक्ट close() के माध्यम से बंद हो जाता है . यदि आप किसी भी प्रकार के "कनेक्शन रहित" निष्पादन का उपयोग कर रहे हैं, तो वह है engine.execute() या statement.execute() , ResultProxy उस निष्पादन कॉल से लौटाई गई वस्तु को पूरी तरह से पढ़ा जाना चाहिए, या अन्यथा स्पष्ट रूप से close() . के माध्यम से बंद किया जाना चाहिए . एक Connection या ResultProxy जो अभी भी खुला है वह NullPool . को प्रतिबंधित करेगा या dispose() हर अंतिम कनेक्शन को बंद करने के दृष्टिकोण।