我制作了一个名为"/get_report“的POST API,它接受用户的一些输入,并通过在数据库上执行一些搜索查询来根据输入返回数据。如果我继续多次访问相同的API,比如7-8次,那么在第9次点击时,它会抛出错误"sqlalchemy.exc.TimeoutError: QueuePool限制大小为5溢出10,连接超时,超时值30.00 (此错误的背景为:https://sqlalche.me/e/14/3o7r)“。
这是我的main.py:
from flask_sqlalchemy import SQLAlchemy
from flask import Flask, jsonify, request
from helper import *
from models.tx import *
app = Flask(__name__)
db = SQLAlchemy()
DB_URL = 'postgresql://postgres:postgres@localhost/test_db'
engine = create_engine(DB_URL)
Session = sessionmaker(engine)
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URL
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
@contextmanager
def session_manager():
s = Session()
try:
yield s
except:
s.rollback()
raise
finally:
s.close()
@app.route('/get_report', methods=['POST'])
def get_report():
try:
vendor = request.form['vendor']
circle = request.form['circle']
c_name = request.form['c_name']
c_port = request.form['c_port']
all_ssr = request.form['all_ssr']
data_list = []
table_name = get_table_by_vendor(vendor, circle)
if table_name != None:
with session_manager() as s:
if all_ssr == 'SSR':
result = s.query(table_name).distinct(table_name.label, table_name.c_node, \
table_name.c_port, table_name.z_port, table_name.z_node) \
.filter(and_((or_( and_(table_name.c_node == c_name, table_name.c_port == c_port), \
and_(table_name.z_node == c_name, table_name.z_port == c_port ))), \
(table_name.__table__.c[field_name].like('SSR%')))).all()
elif all_ssr == 'ALL':
# Get all the records
result = s.query(table_name).distinct(table_name.label, table_name.c_node, \
table_name.c_port, table_name.z_port, table_name.z_node) \
.filter(or_( and_(table_name.c_node ==c_name, table_name.c_port == c_port), \
and_(table_name.z_node == c_name, table_name.z_port == c_port ))).all()
else:
result = []
# Preparing JSON data to send
for item in result:
port = c_port if c_port != '' else (item.c_port if item.c_node == c_name else item.z_port)
data_dict = {'user': item.user, 'port': item.port, 'rate':item.rate, 'down': item.down}
data_list.append(data_dict)
response = {"status": "Success", "message": "Successfully Fetched", "data": data_list}
return jsonify(response)
if __name__ == '__main__':
app.run(host='0.0.0.0', port = 5000,debug = True)这是我的模型/tx.py:
class C_Segment(db.Model):
__tablename__ = 'c_segment'
id = db.Column(db.Integer, primary_key=True)
c_node = db.Column(db.String(350), nullable=False)
c_port = db.Column(db.String(200), nullable=False)
label = db.Column(db.String(350), nullable=False)
z_port = db.Column(db.String(200), nullable=False)
z_node = db.Column(db.String(200), nullable=False)
user = db.Column(db.String(200), nullable=False)
down = db.Column(db.String(200), nullable=False)
port = db.Column(db.String(200), nullable=False)
rate = db.Column(db.String(200), nullable=FaI
return '<id {}>'.format(self.id)我在谷歌上搜索了很多相关的内容,但是没有一个对我有帮助。我也尝试过增加池的大小和溢出的大小,但是什么也没有发生。我不明白确切的问题在哪里。从过去的两天开始,我就一直被困在这个问题上,并且已经浏览了许多堆栈溢出内容和烧瓶sqlalchemy会话文档。
发布于 2022-02-11 20:52:54
池中有一组连接,例如15条(池中5条,可能溢出10条)。如果请求处理时间超过连接签出超时时间(可用连接的等待时间(默认为30秒)),则会得到此错误(所有15个连接都很忙,您的请求必须等待可用连接-但只能等待30秒,之后才会出现错误)。您考虑过查询优化吗?你桌子上有多少张唱片?请求持续多长时间?可以使用以下方法分析SQL查询:
EXPLAIN ANALYZE <query>当然,您可以通过设置例如300 s(5分钟)来增加池超时:
app.config['SQLALCHEMY_POOL_TIMEOUT'] = 300或者让游泳池更大,但这并不能真正解决你的问题。请求中这么长的响应时间实在是糟糕的UX,限制了客户端对应用程序的并发访问。因此,我建议您加快查询速度。
https://stackoverflow.com/questions/71081941
复制相似问题