2016-03-03 149 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