这是我想要运行的示例代码:
for i in range(1,2000):
db = create_engine('mysql://root@localhost/test_database')
conn = db.connect()
#some simple data operations
conn.close()
db.dispose()
有没有一种方法可以运行它而不会从MySQL获得“Too many connections”错误? 我已经知道我可以处理连接,或者有连接池。我只想了解如何正确关闭sqlalchemy的连接。 提前谢谢!
答案 0 :(得分:61)
以下是如何正确编写代码:
db = create_engine('mysql://root@localhost/test_database')
for i in range(1,2000):
conn = db.connect()
#some simple data operations
conn.close()
db.dispose()
也就是说,Engine
是连接的 factory 以及连接的 pool ,而不是连接本身。当您说conn.close()
时,连接将返回引擎中的连接池,而不是实际关闭。
如果您确实希望实际关闭连接,即不进行池化,请通过NullPool
禁用池化:
from sqlalchemy.pool import NullPool
db = create_engine('mysql://root@localhost/test_database', poolclass=NullPool)
使用上述Engine
配置,每次调用conn.close()
都将关闭基础DBAPI连接。
如果OTOH你真的想在每次调用时连接到不同的数据库,也就是说,你的硬编码"localhost/test_database"
只是一个例子,你实际上有很多不同的数据库,那么这个方法使用dispose()
很好;它将关闭未从池中检出的每个连接。
在上述所有情况中,重要的是Connection
对象通过close()
关闭。如果您正在使用任何类型的“无连接”执行,即engine.execute()
或statement.execute()
,则应完全读取从该执行调用返回的ResultProxy
对象,或通过{显式关闭{1}}。仍然处于打开状态的close()
或Connection
会禁止ResultProxy
或NullPool
方法关闭每个最后一个连接。
答案 1 :(得分:4)
试图找出一个与数据库断开连接以解决无关问题的解决方案(在分叉之前必须断开连接)。
您还需要invalidate来自连接池的连接。
在你的例子中:
for i in range(1,2000):
db = create_engine('mysql://root@localhost/test_database')
conn = db.connect()
# some simple data operations
# session.close() if needed
conn.invalidate()
db.dispose()