如何在MySQL中关闭sqlalchemy连接

时间:2011-12-27 13:38:12

标签: mysql sqlalchemy

这是我想要运行的示例代码:

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的连接。 提前谢谢!

2 个答案:

答案 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会禁止ResultProxyNullPool方法关闭每个最后一个连接。

答案 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()