Berikut cara menulis kode tersebut dengan benar:
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()
Yaitu, Engine
adalah pabrik untuk koneksi serta kolam koneksi, bukan koneksi itu sendiri. Saat Anda mengucapkan conn.close()
, koneksi dikembalikan ke kumpulan koneksi di dalam Engine , sebenarnya tidak ditutup.
Jika Anda ingin koneksi benar-benar ditutup, yaitu, tidak digabungkan, nonaktifkan penggabungan melalui NullPool
:
from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool)
Dengan Engine
di atas konfigurasi, setiap panggilan ke conn.close()
akan menutup koneksi DBAPI yang mendasarinya.
Jika OTOH Anda benar-benar ingin terhubung ke berbeda database pada setiap panggilan, yaitu "localhost/test_database"
hardcode Anda hanyalah sebuah contoh dan Anda sebenarnya memiliki banyak database yang berbeda, maka pendekatannya menggunakan dispose()
baik-baik saja; itu akan menutup setiap koneksi yang tidak diperiksa dari kumpulan.
Dalam semua kasus di atas, yang penting adalah Connection
objek ditutup melalui close()
. Jika Anda menggunakan jenis eksekusi "tanpa koneksi", yaitu engine.execute()
atau statement.execute()
, ResultProxy
objek yang dikembalikan dari panggilan eksekusi itu harus dibaca sepenuhnya, atau secara eksplisit ditutup melalui close()
. Sebuah Connection
atau ResultProxy
yang masih terbuka akan melarang NullPool
atau dispose()
mendekat dari menutup setiap koneksi terakhir.