반응형
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 = true
uwsgi 구성 MySQL 연결은 올바르게 작동합니다.
언급URL : https://stackoverflow.com/questions/35608542/flask-sqlalchemy-and-mysql-server-has-gone-away
반응형
'source' 카테고리의 다른 글
Vuex getter가 업데이트되지 않음 (0) | 2022.09.14 |
---|---|
스프링 크론 vs 일반 크론? (0) | 2022.09.14 |
Python에서 변수가 None, True 또는 False일 경우 어떻게 테스트해야 합니까? (0) | 2022.09.14 |
왜 우리는 불변의 계급이 필요한가? (0) | 2022.09.13 |
JavaScript/jQuery DOM 변경 청취자가 있습니까? (0) | 2022.09.13 |