source

Flask, SQL Chemy 및 MySQL Server가 없어졌습니다.

factcode 2022. 9. 14. 22:12
반응형

Flask, SQL Chemy 및 MySQL Server가 없어졌습니다.

Flask 어플리케이션에서 MariaDB(MySQL) 서버에 SQL Chemy로 연결되어 있습니다.범위 지정 세션을 사용하여 응용 프로그램 컨텍스트 해체 시 세션을 제거합니다.

engine = create_engine(config.SQLALCHEMY_DATABASE_URI, pool_recycle=3600, isolation_level='READ_COMMITTED')
db_session = scoped_session(sessionmaker(autocommit=True, bind=engine))

@app.teardown_appcontext
def shutdown_session(exception=None):
    db_session.remove()

또한 8명의 직원과 함께 uwsgi를 사용하여 애플리케이션을 nginx에 바인드합니다.

요청 중에 "MySQL server has away" 오류가 발생할 수 있습니다.요청을 반복할 때는 오류가 없지만 다시 반복하면 오류가 발생합니다.요청을 여러 번 반복하면 문제가 사라집니다.응용 프로그램 재시작 후(항상은 아님) 또는 MySQL 재시작 후 발생할 수 있습니다.

답변은 사용 후 세션을 종료하도록 조언합니다.teardown_appcontext에서 세션을 삭제하는 것도 마찬가지라고 생각합니다.

또한 수동으로 롤백 세션을 시도했지만 도움이 되지 않습니다.

다음과 같은 솔루션이 나에게 올바르게 작용합니다.서버 접속 오류는 커스텀세션 및 쿼리(ORM 쿼리의 경우) 클래스의 메서드로 처리됩니다.

from sqlalchemy import exc, create_engine, MetaData
from sqlalchemy.orm import scoped_session, sessionmaker, Session, Query

MAX_RETRIES = 2

class RetryQuery(Query):
    def _execute_and_instances(self, *args, **kwargs):
        retry = MAX_RETRIES
        while retry:
            retry -= 1
            try:
                return super(RetryQuery, self)._execute_and_instances(*args, **kwargs)
            except exc.SQLAlchemyError as e:
                if e.orig.args[0] in (2006, 2013, 2014, 2045, 2055) and retry and e.connection_invalidated:
                    continue
                else:
                    raise


class RetrySession(Session):
    def __init__(self, *args, **kwargs):
        kwargs['query_cls'] = RetryQuery
        super(RetrySession, self).__init__(*args, **kwargs)

    def execute(self, *args, **kwargs):
        retry = MAX_RETRIES
        while retry:
            retry -= 1
            try:
                return super(ReconnSession, self).execute(*args, **kwargs)
            except exc.SQLAlchemyError as e:
                if e.orig.args[0] in (2006, 2013, 2014, 2045, 2055) and retry and e.connection_invalidated:
                    continue
                else:
                    raise


engine = create_engine(config.SQLALCHEMY_DATABASE_URI, pool_recycle=3600, isolation_level='READ_COMMITTED')
db_session = scoped_session(class_=RetrySession, sessionmaker(autocommit=True, bind=engine))

db_session.execute("SELECT col FROM table")
db_session.query(User).all()

저는 이 문제의 진짜 원인을 발견했습니다: 8명의 uwsgi 근로자들이 사용하는 공유 메모리입니다.추가 후lazy-apps = trueuwsgi 구성 MySQL 연결은 올바르게 작동합니다.

언급URL : https://stackoverflow.com/questions/35608542/flask-sqlalchemy-and-mysql-server-has-gone-away

반응형