So schreiben Sie diesen Code richtig:
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()
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://[email protected]/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.