首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作错误2.操作错误

操作错误2.操作错误
EN

Stack Overflow用户
提问于 2020-03-10 09:24:58
回答 1查看 2.4K关注 0票数 3

我已经创建了一个Python应用程序,并使用flask将其部署在Azure App service上。这个web应用程序使用flask_sqlalchemy连接到PostgreSQL数据库,该数据库也部署在Azure Database for PostgreSQL server上。

有时,在web应用程序插入一行的“小”查询(六个字段)之后,我会收到下面的错误:

代码语言:javascript
复制
sqlalchemy.exc.InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). 
Original exception was: (psycopg2.OperationalError) SSL SYSCALL error: EOF detected

[SQL: INSERT INTO <table>]
[parameters: <row's parameters>]
(Background on this error at: http://sqlalche.me/e/e3q8) (Background on this error at: http://sqlalche.me/e/7s2a)

当web应用程序还在部署时,我重新启动了数据库服务器,发现连接的下降导致了错误。如果我重新启动应用程序服务,这个问题就会得到解决。

当我在本地部署web应用程序并断开数据库时,我会得到一个稍微不同的错误:

代码语言:javascript
复制
sqlalchemy.exc.OperationalError: (psycopg2.OperationalError) server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

[SQL: INSERT INTO <table>]
[parameters: <row's parameters>]
(Background on this error at: http://sqlalche.me/e/e3q8)

根据SQLAlchemy的建议,我将数据库连接更改为:

代码语言:javascript
复制
db = SQLAlchemy(engine_options={"pool_pre_ping": True})

这解决了本地部署的web应用程序的问题,但是Azure部署的web应用程序仍然会出现相同的错误消息。

有什么建议吗?

pip冻结:

代码语言:javascript
复制
aniso8601==8.0.0
atomicwrites==1.3.0
attrs==19.3.0
certifi==2019.11.28
cffi==1.14.0
chardet==3.0.4
Click==7.0
colorama==0.4.3
cryptography==2.8
Flask==1.1.1
flask-restx==0.1.1
Flask-SQLAlchemy==2.4.1
idna==2.8
importlib-metadata==1.5.0
itsdangerous==1.1.0
Jinja2==2.11.1
jsonschema==3.2.0
jwt==0.6.1
MarkupSafe==1.1.1
more-itertools==8.2.0
numpy==1.18.1
packaging==20.1
pandas==1.0.1
pluggy==0.13.1
psycopg2==2.8.4
py==1.8.1
pycparser==2.19
PyJWT==1.7.1
pyparsing==2.4.6
pyrsistent==0.15.7
pytest==5.3.5
python-dateutil==2.8.1
pytz==2019.3
requests==2.22.0
scipy==1.4.1
six==1.14.0
SQLAlchemy==1.3.13
urllib3==1.25.8
wcwidth==0.1.8
Werkzeug==0.16.1
wincertstore==0.2
zipp==3.0.0
EN

回答 1

Stack Overflow用户

发布于 2022-04-02 10:08:19

我们通过与数据库有更多的防御性连接来修正它;将所有连接放入try/catch中,如果引发了psycopg2异常,则定期刷新和重试。

代码语言:javascript
复制
attempts = 0
while attempts <= 5:
    attempts = attempts + 1
    logger.info("Attempt " + str(attempts))
    try:
        db.session.add(job_status)
        db.session.commit()
        return
    except (SQLAlchemyError, OperationalError) as e:
        if attempts < 5:
            logger.warning("Attempt failed. Trying rollback")
            db.session.rollback()
            time.sleep(5)
        else:
            logger.error("Maximum number of retries reached. Raising an error")
            raise e

回答从https://stackoverflow.com/revisions/60614632/4https://stackoverflow.com/q/60614632/5320906https://stackoverflow.com/users/3868134/amychodorowski

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

https://stackoverflow.com/questions/60614632

复制
相关文章

相似问题

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