BrokenPipeError SQLAlchemy云SQL应用程序引擎标准

2024-04-20 00:05:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序引擎标准,使用云SQL(postgres)数据库。每当应用程序看起来空闲时,我都会得到BrokenPipeError,但我不知道为什么

我从stackdriver获得以下堆栈跟踪:

BrokenPipeError: [Errno 32] Broken pipe
at write (/opt/python3.7/lib/python3.7/socket.py:607)
at execute (/env/lib/python3.7/site-packages/pg8000/core.py:1908)
at execute (/env/lib/python3.7/site-packages/pg8000/core.py:860)
at do_execute (/env/lib/python3.7/site-packages/sqlalchemy/engine/default.py:588)
at _execute_context (/env/lib/python3.7/site-packages/sqlalchemy/engine/base.py:1246)
at reraise (/env/lib/python3.7/site-packages/sqlalchemy/util/compat.py:153)
at _handle_dbapi_exception (/env/lib/python3.7/site-packages/sqlalchemy/engine/base.py:1478)
at _execute_context (/env/lib/python3.7/site-packages/sqlalchemy/engine/base.py:1250)
at _execute_clauseelement (/env/lib/python3.7/site-packages/sqlalchemy/engine/base.py:1101)
at _execute_on_connection (/env/lib/python3.7/site-packages/sqlalchemy/sql/elements.py:293)
at execute (/env/lib/python3.7/site-packages/sqlalchemy/engine/base.py:982)
at _execute_and_instances (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:3414)
at __iter__ (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:3389)
at one_or_none (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:3316)
at one (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:3347)
at load_on_pk_identity (/env/lib/python3.7/site-packages/sqlalchemy/orm/loading.py:284)
at _get_impl (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:1116)
at get (/env/lib/python3.7/site-packages/sqlalchemy/orm/query.py:1004)
at graphql (/srv/app.py:168)
at wrapper (/env/lib/python3.7/site-packages/flask_jwt_extended/view_decorators.py:129)
at wrapped_function (/env/lib/python3.7/site-packages/flask_cors/decorator.py:128)
at dispatch_request (/env/lib/python3.7/site-packages/flask/app.py:1935)
at full_dispatch_request (/env/lib/python3.7/site-packages/flask/app.py:1949)
at reraise (/env/lib/python3.7/site-packages/flask/_compat.py:39)
at handle_user_exception (/env/lib/python3.7/site-packages/flask/app.py:1820)
at full_dispatch_request (/env/lib/python3.7/site-packages/flask/app.py:1951)
at wsgi_app (/env/lib/python3.7/site-packages/flask/app.py:2446)

关键行似乎是at graphql (/srv/app.py:168),即:

user = models.User.query.get(user_uuid) # Flask-SQLAlchemy convenience method

看起来我的数据库连接已经过时,这就是它失败的原因。它也发生在同一条线上的不同入口点。我想我的问题是——当应用程序引擎关闭/休眠实例时,它会关闭连接吗。在我看来,如果是这样的话,应该在重新初始化时启动它们。我无法在本地复制,所以我假设这与服务的配置方式有关,或者我们的云SQL实例自动关闭连接,或者应用引擎正在这样做?但是关于这方面的文档很少,我还没有找到任何相关信息。有人知道这是什么原因吗


Tags: pyenvapp应用程序flaskexecutebasesqlalchemy
2条回答

我也有同样的问题。对我来说,第一个快速修复方法是远离pg8000驱动程序,只使用psycopg2

SQLALCHEMY_DATABASE_URI = f'postgres+psycopg2://{db_user}:{db_password}@/{db_name}?host=/cloudsql/{db_connection_name}'

当试图写入另一侧完全关闭的套接字时,通常会发生断管错误。当客户端程序不等待从服务器接收到所有数据并简单地关闭套接字(使用close函数)时,可能会发生这种情况。在MySQL的“B.4.2.8 MySQL服务器已经消失”文档页面上,对这个问题进行了广泛的讨论

此外,我认为审查MySQL Best practices将特别注意与MySQL连接处理相关的适当应用程序实现是很方便的

相关问题 更多 >