2016-03-03 115 views
1

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

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

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) 

回答

0

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

SQLAlchemy docs

[...]对于遇到的每个Engine,一个Connection与它关联,其经由Engine.contextual_connect()方法所获得。 [...]

然后,Engine.contextual_connect()点你Engine.connect(),其中规定了以下内容:

Connection对象是,为了与数据库进行通讯内部使用DBAPI连接的门面。此连接是从此引擎引用的连接保存Pool获取的。当调用Connection对象的close()方法时,底层的DBAPI连接将返回到连接池,在连接池中,可以在随后调用connect()时再次使用该连接。

+0

您是否有描述此文档的链接?这留下了一些解释:http://docs.sqlalchemy.org/en/rel_1_0/core/pooling.html – Trent

+0

@Trent [This](http://docs.sqlalchemy.org/en/latest/orm/session_transaction.html #managing-transactions)描述会话如何与连接相关操作。它告诉你一个会话通过'Engine.contextual_connect'并最终['Engine.connect']获得一个连接(http://docs.sqlalchemy.org/en/latest/core/connections.html#sqlalchemy.engine.Engine .connect),然后描述池化行为。 – univerio

+0

我非常希望将连接池绑回db。也就是说,连接上的特定“闲置”状态是否表明这可能是该池的一部分?我的主要目标是确定何时/如果我们有连接泄漏。 – Trent