So schreiben Sie diesen Code richtig:
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()
Das heißt, die Engine ist eine Fabrik für Verbindungen sowie einen Pool von Verbindungen, nicht die Verbindung selbst. Wenn Sie conn.close() sagen , wird die Verbindung an den Verbindungspool innerhalb der Engine zurückgegeben , nicht wirklich geschlossen.
Wenn Sie möchten, dass die Verbindung tatsächlich geschlossen wird, d. h. nicht gepoolt wird, deaktivieren Sie das Pooling über NullPool :
from sqlalchemy.pool import NullPool
db = create_engine('mysql://example@sqldat.com/test_database', poolclass=NullPool)
Mit obiger Engine Konfiguration, jeder Aufruf von conn.close() schließt die zugrunde liegende DBAPI-Verbindung.
Wenn OTOH Sie tatsächlich mit anderen verbinden möchten Datenbanken bei jedem Aufruf, d. h. Ihr fest codierter "localhost/test_database" nur ein Beispiel ist und Sie tatsächlich viele verschiedene Datenbanken haben, dann der Ansatz mit dispose() ist gut; es schließt jede Verbindung, die nicht aus dem Pool ausgecheckt ist.
In allen oben genannten Fällen ist es wichtig, dass die Connection Objekt wird über close() geschlossen . Wenn Sie irgendeine Art von "verbindungsloser" Ausführung verwenden, ist das engine.execute() oder statement.execute() , der ResultProxy Das von diesem Ausführungsaufruf zurückgegebene Objekt sollte vollständig gelesen oder anderweitig explizit über close() geschlossen werden . Eine Connection oder ResultProxy das noch offen ist, verbietet den NullPool oder dispose() Annäherungen daran, jede letzte Verbindung zu schließen.