Đây là cách viết mã đó một cách chính xác:
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()
Đó là, Engine
là một nhà máy cho các kết nối cũng như một hồ bơi kết nối, không phải bản thân kết nối. Khi bạn nói conn.close()
, kết nối được trả về nhóm kết nối trong Engine , không thực sự đóng cửa.
Nếu bạn muốn kết nối thực sự bị đóng, tức là không được gộp chung, hãy tắt tính năng gộp chung qua NullPool
:
from sqlalchemy.pool import NullPool
db = create_engine('mysql://[email protected]/test_database', poolclass=NullPool)
Với Engine
ở trên cấu hình, mỗi lệnh gọi đến conn.close()
sẽ đóng kết nối DBAPI cơ bản.
Nếu OTOH bạn thực sự muốn kết nối với khác nhau cơ sở dữ liệu trên mỗi cuộc gọi, tức là "localhost/test_database"
được mã hóa cứng của bạn chỉ là một ví dụ và bạn thực sự có rất nhiều cơ sở dữ liệu khác nhau, thì cách tiếp cận bằng cách sử dụng dispose()
Ổn; nó sẽ đóng mọi kết nối không được kiểm xuất khỏi nhóm.
Trong tất cả các trường hợp trên, điều quan trọng là Connection
đối tượng được đóng qua close()
. Nếu bạn đang sử dụng bất kỳ loại thực thi "không kết nối" nào, đó là engine.execute()
hoặc statement.execute()
, ResultProxy
đối tượng được trả về từ lệnh gọi thực thi đó phải được đọc hoàn toàn, hoặc nếu không thì phải đóng một cách rõ ràng qua close()
. Một Connection
hoặc ResultProxy
mà vẫn mở sẽ cấm NullPool
hoặc dispose()
cách tiếp cận từ việc đóng mọi kết nối cuối cùng.