【问题标题】:SQLAlchemy, PostgreSQL Connection PoolingSQLAlchemy,PostgreSQL 连接池
【发布时间】:2016-03-03 19:30:55
【问题描述】:

希望这对某人来说应该是一个快速的答案。我已经浏览了一些文档,但仍然没有找到明确的答案。即使我在 SQLAlchemy 中执行 session.close(),我也有许多“空闲”连接。这些空闲连接是 SQLAlchemy/Postgres 处理连接池的方式吗?

这是我用来检查数据库连接活动的查询

SELECT * FROM pg_stat_activity ;

这里是示例代码:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

application = Flask(__name__)
application.config.from_object('config')
db = SQLAlchemy(application)


class Brand(db.Model):
    id = db.Column(db.Integer, primary_key=True)

@application.route('/')
def documentation():
    all = Brand.query.all()
    db.session.remove() #don't need this since it's called on teardown
    return str(len(all))

if __name__ == '__main__':
    application.run(host='0.0.0.0', debug=True)

【问题讨论】:

    标签: python-3.x flask sqlalchemy postgresql-9.4


    【解决方案1】:

    是的。关闭会话不会立即关闭底层 DBAPI 连接。连接会被放回池中以供后续重用。

    来自SQLAlchemy docs

    [...] 对于遇到的每个Engine,都有一个与之关联的Connection,这是通过Engine.contextual_connect() 方法获取的。 [...]

    然后,Engine.contextual_connect() 将您指向Engine.connect(),其中声明如下:

    Connection 对象是一个外观,它在内部使用 DBAPI 连接来与数据库通信。此连接是从该引擎引用的连接持有Pool 获取的。当调用Connection 对象的close() 方法时,底层DBAPI 连接随后返回到连接池,在随后的connect() 调用中可以再次使用它。

    【讨论】:

    • 您是否有指向描述此内容的文档的链接?这留下了一些解释:docs.sqlalchemy.org/en/rel_1_0/core/pooling.html
    • @Trent This 描述了会话如何与连接相关联。它告诉您会话通过Engine.contextual_connect 并最终通过Engine.connect 获取连接,然后描述池行为。
    • 我对将连接池绑定回数据库非常感兴趣。也就是说,连接上的特定“空闲”状态是否表明这可能是该池的一部分?我的主要目标是确定我们何时/是否有连接泄漏。
    猜你喜欢
    • 2013-04-03
    • 2010-11-25
    • 1970-01-01
    • 2014-11-04
    • 2014-12-15
    • 2016-04-26
    • 1970-01-01
    • 2012-03-10
    • 2013-10-12
    相关资源
    最近更新 更多