Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So schließen Sie die sqlalchemy-Verbindung in MySQL

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.