如何调查SQLAlchemy QueuePool限制溢出?

时间:2017-11-02 06:42:08

标签: python mysql flask sqlalchemy flask-sqlalchemy

我得到了

  

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

我见过这些问题:

以及他们的答案。我尝试了它们,我试图在very simplified codebase中重现我的问题。我无法重现它。

我该怎么做才能找到/解决问题?

例如,我可以在Python中获得QueuePool的当前“用法”吗?

(另外,但可能更好的另一个问题:为什么我不应该将队列溢出设置为-1?)

到目前为止我没有尝试的是设置app.config['SQLALCHEMY_POOL_RECYCLE'](设置为here)。我想我必须将它设置为一个较低的值才能解决这个问题,但是我可能会在其他地方获得超时,对吧?

1 个答案:

答案 0 :(得分:1)

  1. 对MySQL数据库运行show PROCESSLIST以显示连接/池/用法。

    • 在PyCharm中,打开"数据库"侧栏(通常在右侧),然后右键单击您的数据库/架构并选择"打开控制台"。粘贴在上面的命令中,然后单击绿色"执行"按钮。
    • 我注意到当我使用API​​时,每个API调用都会打开一个单独的连接,当它们达到20个连接时,下一个API调用会导致错误,即TimeoutError: QueuePool limit of size 10 overflow 10 reached( 10 + 10 = 20)。
    • 当我摆脱threaded=True时,我只看到一个连接打开。
  2. 提交或隐藏所有现有的更改,然后创建一个分支并开始剥离代码/逐个简化您的应用程序并查看问题是否仍然会弹出。

    • 在这种情况下我没有使用这种技术,但在处理其他严重难以追踪的错误时,我已成功使用它。
    • 由于您提到无法通过一个简单的示例重现该问题,我认为值得建议将此技术作为一种最小化示例的方式。
  3. (与#2结合使用)尝试减少SQLALCHEMY_POOL_SIZE Flask-SQLAlchemy设置,以便更快地重现错误。

    • 这里的想法是让崩溃更快发生。
    • 在这种情况下,我没有这样做。