sql >> Databasteknik >  >> RDS >> Mysql

Hur man stänger sqlalchemy-anslutning i MySQL

Så här skriver du den koden korrekt:

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()

Det vill säga Engine är en fabrik för anslutningar samt en pool av anslutningar, inte själva anslutningen. När du säger conn.close() , återförs anslutningen till anslutningspoolen i motorn , faktiskt inte stängd.

Om du vill att anslutningen faktiskt ska stängas, det vill säga inte poolas, inaktivera pooling via NullPool :

from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool)

Med ovanstående Engine konfiguration, varje anrop till conn.close() kommer att stänga den underliggande DBAPI-anslutningen.

Om OTOH du faktiskt vill ansluta till olika databaser för varje samtal, det vill säga din hårdkodade "localhost/test_database" är bara ett exempel och du har faktiskt massor av olika databaser, då metoden med dispose() är bra; det kommer att stänga alla anslutningar som inte har checkats ut från poolen.

I alla ovanstående fall är det viktiga att Connection objekt stängs via close() . Om du använder någon form av "anslutningslös" exekvering, det är engine.execute() eller statement.execute() , ResultProxy objekt som returneras från det exekveringsanropet bör läsas fullständigt eller på annat sätt uttryckligen stängas via close() . En Connection eller ResultProxy som fortfarande är öppen kommer att förbjuda NullPool eller dispose() närmar sig från att stänga alla anslutningar.



  1. Hämta gränsvärdena för en partitionerad tabell i SQL Server (T-SQL)

  2. Hur man skapar en pivotfråga i sql-server utan aggregatfunktion

  3. Optimera PostgreSQL för snabb testning

  4. Är SQLFiddle trasig? Fel för Oracle, SQL Server, ...?