そのコードを正しく書く方法は次のとおりです。
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()
つまり、Engine
工場です 接続およびプール用 接続自体ではなく、接続の。 conn.close()
と言うとき 、接続はエンジン内の接続プールに戻されます 、実際には閉じていません。
接続を実際に閉じたい場合、つまりプールしない場合は、NullPool
を介してプールを無効にします。 :
from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/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()
最後のすべての接続を閉じることからアプローチします。