에러 : pymysql.err.InterfaceError: (0, ‘’)

Python 서버로 만든 웹을 배포하고 이틀이지나자 갑자기 에러가 발생했다.


DB에 접속은 잘되는걸 보니 DB 문제는 아니었다.

서버의 로그를 보니


python에서 mysql과 연결을 도와주는 라이브러리는 pymysql의 오류였다.

cursors 와 connections 에 문제가 생긴 것 같다.

문제는 DB와 통신하는 코드에 있었다.


위 코드에서 conn은 DB 관련 파라미터를 지정해 연결을 하는 작업이고

curs는 SQl을 사용할 수 있게 DB에 접속을 한다는 것으로 이해했다.

그 후에 SQL 쿼리를 이용해 명령어를 사용하고

commit 명령어를 사용해 갱신을 한다.

여기까지가 pymysql 공식 페이지에 나온 내용이다.

하지만 DB에 접속을 하고나서는 close를 이용해 닫아줘야 한다는 것을 알게 됐다.

SQL 쿼리가 끝날때 close를 넣어주기만 하면 끝!

이 부분에서 놓친 것이 있다. 바로 Python의 with !!

close 를 해주지 않아도 닫아주기 때문에 사용하는 것 같다.

이런 문제는 Connection leak라고 부른다고 한다.

  • 수정한 코드



Connection Pool Leak?

connection pool은 데이터베이스에 대한 활성 연결을 유지해서 성능을 향상 시킨다.

DB가 사용되는 과정은 다음과 같다.

API가 pool에서 connection을 빌리고 SQL 쿼리 등을 통해 실행하고 connection을 다시 pool로 반환

만약 pool 로 다시 반환을 하지 않으면 pool connection이 계속 줄어들게 되고 이것을 connection pool leak (커넥션 풀 누수) 라고 한다.

이 문제가 계속되면 connection을 더이상 열수 없어 연결이 끊어진다.

그래서 DB 작업후에는 저장하고 닫아줘야 한다!



추가 에러 pymysql.err.Error: Already closed

코드를 수정하면서 다음과 같은 에러를 만났었는데

DB에 연결하는 것 또한 SQL 쿼리문을 날릴때 마다 연결해줘야 하고

쿼리문이 여러개라면 각 쿼리문마다 열고 닫는 것에 주의해야한다!

Reference