如何调查 SQLAlchemy QueuePool 限制溢出?

Mar*_*oma 6 python mysql sqlalchemy flask flask-sqlalchemy

我明白了

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

我看到了这些问题:

以及他们的答案。我尝试了它们,并尝试在非常简化的代码库中重现我的问题。我无法重现它。

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

例如,我可以获取 Python 中 QueuePool 的当前“使用情况”吗?

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

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

Nat*_*les 2

  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_SIZEFlask-SQLAlchemy 设置以更快地重现错误。

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