gpt4 book ai didi

python - Flask 和 SQLAlchemy 在 PostgreSQL 的事务连接中导致大量 IDLE

转载 作者:太空狗 更新时间:2023-10-29 17:51:04 24 4
gpt4 key购买 nike

我有一个使用 SQLAlchemy 访问 PostgreSQL 数据库的 Flask 网络应用程序。

当我启动应用程序时,会立即在 PostgreSQL 中创建一个“事务中”连接。

当应用程序被使用了一段时间后,其中一些连接会出现在 pg_stat_activity 中。

一段时间后,似乎某些资源发生了死锁,我必须重新启动应用程序才能使其再次运行。

我已经读到,如果我在关闭数据库 session 之前从使用数据库的 View 函数返回,就会发生这种情况。所以为了避免这个问题,我创建了如下装饰器:

@app.teardown_appcontext
def shotdown_session(exception=None):
db.session.remove()

这应该会导致在每次请求后关闭所有 session ,并有效地避免“在事务中”连接的问题。

不幸的是,它似乎没有任何效果。

那么,我该如何真正解决这个问题呢?

更新:

我可能应该补充一点,我已经验证我的装饰器函数确实在运行。我通过向其添加打印来验证这一点:

@app.teardown_appcontext
def shotdown_session(exception=None):
print "@app.teardown_appcontext: shotdown_session()"
db.session.remove()

我还通过向 View 函数添加打印来验证它确实在 View 函数返回后运行:

[...]
products = db.session.query(...).all()
print "BEFORE RETURN"
return render_template("show_products.html", products=products)

这会产生如下日志行:

 * Running on http://0.0.0.0:5000/
* Restarting with reloader
BEFORE RETURN
@app.teardown_appcontext: shotdown_session()
10.0.0.100 - - [03/Dec/2014 13:41:30] "GET /product/51 HTTP/1.1" 200 -

我还检查了代码并在使用 db.session 的每个函数的每次返回之前添加了一个 db.session.remove() 调用。这确实摆脱了交易,但是,它也会导致问题。我将 SQLAlchemy 模型对象从数据库传递到模板。然后一些模板对这些模型对象执行一些操作,导致应用程序失败,因为对象不再附加到 session 。

编辑 2014-12-08:

可以在这里看到连接设置:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, scoped_session
from flask_sqlalchemy import SQLAlchemy

from config import cfg

engine = create_engine(cfg["db_uri"], echo=False, pool_size=10)
db = SQLAlchemy()
Base = db.Model
Session = scoped_session(sessionmaker(bind=engine))

整个应用程序的结构可以在这里找到:http://paste.yt/p3219.html

最佳答案

我在 Debug mode 中运行 Flask 时看到过这种情况。 .如果您的代码抛出异常并且调试器启动,事务将永远不会“回滚”或“删除”。因此,用于失败请求的 session 永远不会返回到池中。

解决方案是禁用 Debug模式。

编辑:

我还见过这种情况发生的另一种情况。如果您有自主运行的代码(即不是 HTTP 事务的一部分——就像在启动 Flask 应用程序时启动和产生的独立线程),它通常会涉及 sleep 。如果您在 sleep 前访问 session ,那么您将在 sleep 期间遇到这样的挂起事务。

另一种可能性是您正在从创建应用程序功能访问 session 。如果这样做,请确保 .remove() 它。否则,该 session 可能会卡在 gevent 应用程序的主线程上。

关于python - Flask 和 SQLAlchemy 在 PostgreSQL 的事务连接中导致大量 IDLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27271516/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com