【问题标题】:BrokenPipeError - SQLAlchemy - Cloud SQL - App Engine StandardBrokenPipeError - SQLAlchemy - Cloud SQL - App Engine 标准
【发布时间】:2020-02-20 20:05:56
【问题描述】:

我在 App Engine Standard 上有一个使用 Cloud SQL (postgres) 数据库的应用。每当应用程序似乎闲置时,我都会收到BrokenPipeErrors,但我不知道为什么。

我从 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

看起来我的数据库连接已经失效,这就是它失败的原因。它也发生在同一行的不同入口点。我想我的问题是——当 App Engine 关闭/休眠实例时,它会关闭连接吗?在我看来,如果是这样,它应该在重新初始化时重新启动它们。我无法在本地复制它,所以我认为它与服务的配置方式有关,我们的 Cloud SQL 实例会自动关闭连接还是 App Engine 正在这样做?但是这方面的文档很少,我还没有找到任何关于它的信息。有谁知道是什么原因造成的?

【问题讨论】:

  • 我也有同样的问题..你找到解决办法了吗?

标签: python google-app-engine flask sqlalchemy google-cloud-sql


【解决方案1】:

我遇到了同样的问题。对我来说,第一个快速解决方法是放弃 pg8000 驱动程序,只使用 psycopg2。

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

【讨论】:

    【解决方案2】:

    Broken pipe 错误通常发生在尝试写入另一端完全关闭的套接字时。当客户端程序没有等到从服务器接收到所有数据并简单地关闭套接字(使用关闭函数)时,可能会发生这种情况。问题在MySQL 的“B.4.2.8 MySQL 服务器已消失”文档页面上得到了广泛的处理。

    另外,我认为查看MySQL Best practices 会很方便,特别注意有关 MySQL 连接处理的正确应用程序实现。

    【讨论】:

      猜你喜欢
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      相关资源
      最近更新 更多