带有 Postgres 的 Flask - 调用几个 API 后数据库崩溃

问题描述 投票:0回答:1

我已经创建了 Flask 应用程序,其中 nginx 在 docker 容器中运行,并且 不同容器中的 postgresql 数据库

我创建了大约10个页面,每个页面最多有3或4个正在调用,响应正常并且页面显示结果

但是,在其中一个页面中,我曾经调用7个API来从flask获取数据, 在每个 API 中,都会对 postgresql 数据库进行多次查询。

所有 7 个 API 均工作正常,没有任何问题 - 经过测试,即使在查询或逻辑中也不会出现错误。

发生的情况是 - 当我打开该特定页面时,前 5 个 api 没有任何问题地获取响应,最后 2 个 api 没有获取响应并收到“504 网关超时”错误

在检查日志时,我收到此错误 -

    Traceback (most recent call last):
    File "./database_functions.py", line 7097, in get_status1
        results = session.query(Customer.id).filter(Customer.category_id==category_id).all()
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3178, in all
        return list(self)
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3334, in __iter__
        return self._execute_and_instances(context)
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3359, in _execute_and_instances
        result = conn.execute(querycontext.statement, self._params)
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 988, in execute
        return meth(self, multiparams, params)
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 287, in _execute_on_connection
        return connection._execute_clauseelement(self, multiparams, params)
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1107, in _execute_clauseelement
        distilled_params,
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1253, in _execute_context
        e, statement, parameters, cursor, context
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1473, in _handle_dbapi_exception
        util.raise_from_cause(sqlalchemy_exception, exc_info)
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 398, in raise_from_cause
        reraise(type(exception), exception, tb=exc_tb, cause=cause)
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 152, in reraise
        raise value.with_traceback(tb)
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1249, in _execute_context
        cursor, statement, parameters, context
    File "/usr/local/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 552, in do_execute
        cursor.execute(statement, parameters)
    sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly
            This probably means the server terminated abnormally
            before or while processing the request.

错误发生在通常有效的简单查询中

后来我创建了一个新页面,只调用了最后两个API,并将结果显示在网页上,它正在工作

然后,在网页中,我依次调用了所有 7 个 API - 比如,第一个 api 从 Flask 获取响应,然后第二个 api 将调用,依此类推 - 在这个实验中,最后一个也是如此两个 API 出现相同的错误

这个错误是miss-leading,如何追踪错误

我曾经通过 sqlalchemy 引擎访问 Flask 上的 postgres docker 容器中的数据库 -

from sqlalchemy import create_engine
engine = create_engine('postgresql+psycopg2://postgres:postgres@localhost:5432/customer',
    pool_size=20, max_overflow=10,
)

如何解决这个问题

编辑

Postgresql - docker 容器内的日志 -

调用网页后,遇到了同样的问题,在 postgres 日志中,我得到了这个 -

LOG:  statement: BEGIN
LOG:  statement: <other query>
LOG:  statement: ROLLBACK
LOG:  statement: BEGIN
LOG:  statement: <other query>
LOG:  statement: ROLLBACK
LOG:  statement: BEGIN
LOG:  statement: <other query>
LOG:  statement: ROLLBACK
LOG:  statement: ROLLBACK

在 docker-compose.yml 中

version: "3.4"
services:
    postgres:
        container_name: postgres_db
        restart: unless-stopped
        image: postgres:9.6.24
        command: ["postgres", "-c", "logging_collector=on", "-c", "log_directory=./postgres_db_logs", "-c", "log_filename=postgresql.log", "-c", "log_statement=all"]
        ports:
        - "5432:5432"
        environment:
        POSTGRES_USER: 'postgres'
        POSTGRES_PASSWORD: 'postgres'
        volumes:
        - ./pgdata:/var/lib/postgresql/data

对于每个 API,我创建会话并正确关闭它,

init中:

session = sessionmaker(bind=engine)
self.Session = scoped_session(session)

并且在每个 API 中,

def get_customer_data(self):
    session = self.Session()
    try:
            ....
    except:
            ....
    finally:
            session.close()
            return data
python postgresql docker flask sqlalchemy
1个回答
0
投票

我在postgresql中通过设置

pg_stat_statement
调试查询后发现了这个问题,调用api后,查询占用了cpu_portion的38%,并且需要超过10000毫秒才能完成查询

因此,我在查询搜索的列上使用了索引技术。 并且查询工作速度很快并找到,到目前为止没有连接停止或回滚的问题

© www.soinside.com 2019 - 2024. All rights reserved.