我已经创建了 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
我在postgresql中通过设置
pg_stat_statement
调试查询后发现了这个问题,调用api后,查询占用了cpu_portion的38%,并且需要超过10000毫秒才能完成查询
因此,我在查询搜索的列上使用了索引技术。 并且查询工作速度很快并找到,到目前为止没有连接停止或回滚的问题