【发布时间】:2021-12-21 00:22:25
【问题描述】:
我有一个 Flask 应用程序,它使用 SQLAlchemy 作为其 ORM 和 PostgreSQL 作为数据库管理系统进行 insert、select、update 查询。最小的工作示例是:
import config as cfg
from flask import Flask
from extensions import db
flask_app = Flask(__name__)
flask_app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
flask_app.config['SQLALCHEMY_DATABASE_URI'] = cfg.POSTGRES_DB_CONNECT
flask_app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {"pool_pre_ping": True,
"pool_recycle": 600}
flask_app.secret_key = cfg.SECRET_KEY
db.init_app(flask_app)
if __name__=="__main__":
app.run()
如您所见,pool_recycle 参数设置为 600,因此它可以关闭超过 10 分钟的连接。但是,当我检查我的 pg_stat_activity 时,它显示了长达 2 小时的空闲状态连接。我使用这个查询来检查 pg_stat_activity:
SELECT * FROM pg_stat_activity WHERE client_addr='my_service_hostname' ORDER BY query_start DESC;
我不明白为什么这些查询保留为空闲状态,并且在查询开始后 10 分钟内没有消失。也许我的错误在于我对连接池的工作方式知之甚少。有没有办法在 10 分钟内关闭连接?
更新 1:这是我使用任何查询的视图函数的最小工作示例:
import config as cfg
import os
from flask import request
from models.document import Document
from app import flask_app, ps_work
from extensions import db
from file_processors import common, documents
@flask_app.route("/files/<string:uuid>", methods=['POST'])
def upload(uuid):
file = request.files['file']
file_uuid = uuid.lower()
if file:
filename = common.Secure_Filename(request.form.get('name', file.filename)).secure_filename()
db_file = Document(file_uuid, filename)
db.session.add(db_file)
db.session.commit()
# HERE I DO SOME UPDATE
while not ps_work.check_file_exists(os.path.join(path,filename)):
file_vault_file_path = db_file.upload_file(path, filename)
db.session.commit()
# HERE I ALSO DO SOME UPDATE
db_file.extract_text(filename)
db_file.sooner_update(extension)
db.session.commit()
我的错误是否有可能是使用 db.session.commit 3 次,而不是使用 db.session.flush 2 次和 db.session.commit 在最后?
【问题讨论】:
标签: python postgresql flask sqlalchemy flask-sqlalchemy