首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何解决烧瓶sqlalchemy连接超时错误(队列池溢出限制)?

问如何解决烧瓶sqlalchemy连接超时错误(队列池溢出限制)?
EN

Stack Overflow用户
提问于 2022-02-11 14:42:59
回答 1查看 1.2K关注 0票数 1

我制作了一个名为"/get_report“的POST API,它接受用户的一些输入,并通过在数据库上执行一些搜索查询来根据输入返回数据。如果我继续多次访问相同的API,比如7-8次,那么在第9次点击时,它会抛出错误"sqlalchemy.exc.TimeoutError: QueuePool限制大小为5溢出10,连接超时,超时值30.00 (此错误的背景为:https://sqlalche.me/e/14/3o7r)“。

这是我的main.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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会话文档。

EN

回答 1

Stack Overflow用户

发布于 2022-02-11 20:52:54

池中有一组连接,例如15条(池中5条,可能溢出10条)。如果请求处理时间超过连接签出超时时间(可用连接的等待时间(默认为30秒)),则会得到此错误(所有15个连接都很忙,您的请求必须等待可用连接-但只能等待30秒,之后才会出现错误)。您考虑过查询优化吗?你桌子上有多少张唱片?请求持续多长时间?可以使用以下方法分析SQL查询:

代码语言:javascript
复制
EXPLAIN ANALYZE <query>

当然,您可以通过设置例如300 s(5分钟)来增加池超时:

代码语言:javascript
复制
app.config['SQLALCHEMY_POOL_TIMEOUT'] = 300

或者让游泳池更大,但这并不能真正解决你的问题。请求中这么长的响应时间实在是糟糕的UX,限制了客户端对应用程序的并发访问。因此,我建议您加快查询速度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71081941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档