【发布时间】:2021-06-26 18:42:11
【问题描述】:
当我在线程中查询 Flask-SQLAlchemy 模型时,数据库连接似乎永远不会关闭。这是一个测试用例:
from threading import Thread
from sqlalchemy.pool import NullPool
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
db = SQLAlchemy()
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgresql:///testdb'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ENGINE_OPTIONS'] = {
'poolclass': NullPool,
}
db.app = app
db.init_app(app)
class TestModel(db.Model):
__tablename__ = "test_table"
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
@app.route('/test-connection')
def test_connection():
def run_test():
models = TestModel.query.all()
print(models)
thread = Thread(target=run_test)
thread.start()
return "OK"
app.run(debug=True, host='0.0.0.0')
当我运行我的路线时,它会在我的 pg_stat_activity 表中永久留下一个 idle in transaction 查询:
testdb=# select query, state from pg_stat_activity where query like '%test_table%' and query not like '%pg_stat_activity%';
query | state
----------------------------------------+---------------------
SELECT test_table.id AS test_table_id +| idle in transaction
FROM test_table |
(1 row)
如果我同步调用run_test 函数而不是在线程中调用该行不会显示。在生产中,这会导致我的应用程序耗尽数据库连接并崩溃。在线程中使用后如何关闭我的 Flask-SQLAlchemy 数据库连接?
我正在使用 Python 3.8.6、SQLAlchemy 1.3.18 和 Flask-SQLAlchemy 2.4.4。
【问题讨论】:
标签: python postgresql flask sqlalchemy flask-sqlalchemy