이슈
mariadb.InterfaceError: Lost connection to MySQL server during query
MariaDB와 SQLalchemy를 사용하는 중에 요청 할 때마다 간헐적으로 계속 끊기는 현상이 발생한 오류입니다.
문제해결
알려지기로는 다음과 같은데요
“해당 오류는 Mysql과 MariaDB에서 발생하는 에러로 장기간 비활성시 발생하는 에러이다.”
저는 당최 예측할 수 없었습니다. 왜냐.....
저의 경우 이게 계속 끊기면 아! 이거다 하고 논리적으로 풀어나가 보겠는데,
- 어느 순간에는 DB 요청 할 때마다 계속 끊겼다가
- 어느 순간에는 한번만 끊겼다가
- 어느 순간에는 끊기지 않는
전혀 예상하지 못하겠는 참 이상한 현상이었습니다
한 가지 찝찝한 것은 저의 경우 방화벽 활성화 하기 전에는 발생하지 않았던 오류였고, 방화벽을 활성화 시킨 후부터 위 에러가 계속 생겼습니다.
어떻게 우연이 딱 겹친 것 일수도 있겠지만 방화벽 때문이 아닌가? 했는데 딱히 방화벽의 문제를 찾진 못했습니다
문제를 찾는 중에
Mysql 솔루션에 대해서
“Wait time”을 늘려라가 가장 많았습니다.
다만 위 방법은 추천하지 않았습니다.
Flask의 공식문서에는 다음과 같이 작성되어 있습니다.
https://flask-sqlalchemy.palletsprojects.com/en/2.x/config/
Configuration — Flask-SQLAlchemy Documentation (2.x)
Configuration The following configuration values exist for Flask-SQLAlchemy. Flask-SQLAlchemy loads these values from your main Flask config which can be populated in various ways. Note that some of those cannot be modified after the engine was created so
flask-sqlalchemy.palletsprojects.com
SQLAlchemy 에서도 해결이 가능한지 찾아 봤는데
다행히 해결 방법이 있었습니다.
SQLAlchemy는 Disconnect Handling 으로 연결에 대한 테스트를 할 수 있는 Pool.pre_ping
을 통해 해결할 수 있다고 합니다.
https://docs.sqlalchemy.org/en/14/core/pooling.html
Connection Pooling — SQLAlchemy 1.4 Documentation
Connection Pooling A connection pool is a standard technique used to maintain long running connections in memory for efficient re-use, as well as to provide management for the total number of connections an application might use simultaneously. Particularl
docs.sqlalchemy.org
SQLAlchemy create_engine으로 작성하셨을 경우 pool_pre_ping=True 를 바로 작성하시면 될 것 같습니다.
저는 Flask를 사용해서 다음과 같이 솔루션을 적용했습니다.
Config.py 파일에 다음과 같이 추가해주시면 되겠습니다.
- 우선 Pre_ping은 추가해주시고, 나머지는 필요하다 판단되시면 넣어주세요.
SQLALCHEMY_POOL_RECYCLE = 35 # 풀의 자동으로 재활용 되는 시간
SQLALCHEMY_POOL_TIMEOUT = 7 # 풀에 대한 연결 시간 초과를 초 단위로 지정
SQLALCHEMY_PRE_PING = True
SQLALCHEMY_ENGINE_OPTIONS = {'pool_recycle': SQLALCHEMY_POOL_RECYCLE, 'pool_timeout': SQLALCHEMY_POOL_TIMEOUT, 'pool_pre_ping': SQLALCHEMY_PRE_PING}
SQLALCHEMY_TRACK_MODIFICATIONS = False
위 솔루션을 통해 해결되었습니다.
이상입니다.
'Programming > Backend' 카테고리의 다른 글
2.Flask MVC 패턴 환경 구축과 Blueprint (0) | 2022.04.22 |
---|---|
1.Flask 웹 서버 구축 시작 (0) | 2022.04.20 |
Spring Request 데이터를 List 형태로 받으면 @Valid 체크가 안되는 현상 해결 방법 (1) | 2021.12.04 |
협업을 위한 snake_case -> camelCase 변환 방법 @JsonNaming, @JsonProperty (0) | 2021.11.22 |
객체 지향, 오브젝트와 의존 관계의 이해 (0) | 2021.10.09 |