Sqlalchemy 连接超时

Posted

技术标签:

【中文标题】Sqlalchemy 连接超时【英文标题】:Sql Alchemy connection time Out 【发布时间】:2011-03-22 14:47:38 【问题描述】:

我正在使用sqlalchemymysql,并使用sql 表达式执行查询。当执行多个查询时,它会超时。我找到了answer,但我不清楚。请问有谁可以帮帮我吗?

TimeoutError: QueuePool limit of size 5 overflow 10达到,连接超时,超时30

【问题讨论】:

这取决于您如何使用会话以及如何创建引擎。如果您使用线程本地会话,并且线程数量大于您在 engine() 中定义的连接池大小,您只需要提高池的大小。如果您使用单线程应用程序,那么 Greg 是正确的,并且您正在泄漏非关闭会话。您可以通过强制执行单个会话每线程行为或确保始终关闭会话来解决此问题,例如使用 with 语法。 【参考方案1】:

每当您在代码中创建新会话时,请务必关闭它。只需拨打session.close()

当我收到此错误时,我以为我正在关闭所有会话,但我仔细看了看,发现有一种新方法我没有。以该方法关闭会话为我修复了此错误。

【讨论】:

绝对有必要关闭会话吗?当会话被删除(超出范围)时,不应该是回到池的连接吗? 这让我很困惑。为什么会话超出范围时不调用 close() 确保在异常触发时也关闭会话。 sqlalchemy 文档建议使用上下文管理器来处理这个问题(以及其他解决方案)。 我没有看到如何“关闭会话”,因为我正在调用 engine.execute(statement)。【参考方案2】:

在多线程模式下,如果你的并发请求数远大于 db 连接池大小,则会抛出 Queue Pool limit of size 5 overflow 10达到error。试试这个:

engine = create_engine('mysql://', convert_unicode=True, 
pool_size=20, max_overflow=100)

to add the pool size

补充:上面的方法不是正确的方法。实际原因是db连接池用完了,没有其他可用连接。最有可能的情况是你错过了释放连接。例如:

@app.teardown_appcontext
def shutdown_session(exception=None):
    db_session.remove()

【讨论】:

仅供参考:这仅适用于烧瓶。

以上是关于Sqlalchemy 连接超时的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLAlchemy 中设置连接超时

TimeoutError: QueuePool 大小为 5 的限制溢出 10,连接超时,超时 30

如何调查 SQLAlchemy QueuePool 限制溢出?

TFTP连接超时

监控老是连接超时怎么回事?

MySQL连接超时自动断开连接应该怎样处理