そのコードを正しく書く方法は次のとおりです。
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()
つまり、Engine 工場です 接続およびプール用 接続自体ではなく、接続の。 conn.close()と言うとき 、接続はエンジン内の接続プールに戻されます 、実際には閉じていません。
接続を実際に閉じたい場合、つまりプールしない場合は、NullPoolを介してプールを無効にします。 :
from sqlalchemy.pool import NullPool
db = create_engine('mysql://example@sqldat.com/test_database', poolclass=NullPool)
上記のEngine 構成、conn.close()への各呼び出し 基盤となるDBAPI接続を閉じます。
OTOHの場合、実際に別のに接続します 各呼び出しのデータベース、つまり、ハードコードされた"localhost/test_database" これは単なる例であり、実際には多くの異なるデータベースがあり、dispose()を使用したアプローチです。 結構です;プールからチェックアウトされていないすべての接続が閉じられます。
上記のすべての場合において、重要なことはConnection オブジェクトはclose()を介して閉じられます 。あらゆる種類の「コネクションレス」実行を使用している場合、それはengine.execute() またはstatement.execute() 、ResultProxy そのexecute呼び出しから返されたオブジェクトは、完全に読み取るか、close()を介して明示的に閉じる必要があります。 。 Connection またはResultProxy まだ開いていると、NullPoolが禁止されます またはdispose() 最後のすべての接続を閉じることからアプローチします。