[SQLAlchemy] Database Connection Pool

Jaehyeong Kwon·2023년 3월 6일
0

데이터베이스

목록 보기
7/10

Flask나 FastAPI를 이용하면서 SQLAlchemy를 주로 이용하고 있고 db를 정의할 때 옵션에 대해 정확하게 알고 사용하고 있지 않는다는 생각이 들어 찾아보기로 하였습니다다. pool_size와 같은 인자를 넘겨주고는 하는데 이를 검색하다 커넥션 풀에 대해서 알게되었고, 이를 좀 더 알아보기로 하였습니다.

1. 커넥션 풀(Connection Pool)이란?

WAS(웹 애플리케이션 서비스)가 실행될 때 DB 연결을 위해 미리 일정 수의 connection 객체를 만들어 Pool에 담아뒀다가 사용자의 요청이 발생하면 Pool에 생성되어 있는 Connection 객체를 넘겨주고 사용자가 사용이 끝나면 Connection 객체를 다시 Pool에 반환하여 보관하는 기법입니다.

2. 커넥션 풀 동작 과정

1) 사용자가 DB를 사용하기 위해 Connection을 요청합니다.
2) Connection Pool에서 사용하지 않는 Connection 객체를 제공합니다.
3) 사용자가 Connection 객체를 사용 완료하면 pool로 반환합니다.

3. 웹 애플리케이션에서 커넥션 풀을 사용해서 얻는 이점

1) 서버의 부하를 줄여준다.

미리 만들어둔 Connection 객체를 제공하지 않고 요청이 올 때마다 신규로 Connection을 만든다고 가정해보도록 하겠습니다. Connection 객체는 TCP 3 Way-Handshake를 진행하여 생성하는데 이 부분에 대해 자원 소모가 상당한 편입니다. DB Connection을 맺는 과정이 부하가 많이 걸리는 작업이라 동시에 많은 사람들이 DB 커넥션을 요구한다면 최악의 경우 서버가 죽어버리는 문제가 발생할 수도 있습니다.

2) 서버의 한정적인 자원을 효율적으로 사용할 수 있다.

두번째로는 서버는 한정적인 자원을 가지고 있는데 요청이 올 때마다 무제한의 Connection을 생성하게 된다면 전체 시스템에 성능에 문제가 생길 수 있습니다. 이러한 문제를 해결하기 위해서 커넥션 풀에 미리 정해진 숫자의 Connection을 생성해서 관리합니다.


4. SQLAlchemy에서의 Connection Pool

SQLAlchemy의 경우 Connection Pool은 데이터베이스 연결을 생성하는 create_engine 시점에 작성할 수 있습니다. SQLAlchemy에 대해 정리해보면 pool_size, max_overflow, pool_recycle, pool_time에 대한 옵션을 넣을 수 있습니다. 이 네 가지 옵션에 대해 알아보도록 하겠습니다.

pool_size, max_overflow

동시에 연결 가능한 개수와 대기 가능한 옵션을 제공합니다. 이 두 가지 옵션은 연관성이 있어 보통 함께 설정합니다.

pool_size = 5, max_overflow = 10

기본 값은 다음과 같습니다. 위의 의미는 5개의 연결, 연결 대기를 10으로 생성한다는 의미입니다.

pool_recycle

보통 유휴 세션의 경우 종료하도록 되어 있는데, pool_recycle을 설정해두면 해당 시간 이후에는 연결을 끊지않고 유지하여 재사용을 하게됩니다.
pool_recycle은 기존 연결된 세션을 재사용하겠다는 의미로 사용되고 있습니다. 설정 시 주의 사항이 있다면 wait_timeout 시간보다 짧게 설정해야 재사용을 할 수 있습니다.너무 짧은 간격으로 pool_recycle을 설정하게 되면 유휴 세션 뿐아니라 데이터 처리 중인 세션에 Echo를 넣어 문제가 될 수 있어 적절하게 조정해야 문제가 발생하지 않습니다.

pool_timeout

pool_timeout은 Pool이 가득 차있을 경우에 대기하는 시간이라고 할 수 있습니다.

pool_timeout = 50

위와 같이 설정하게 되는 경우에, pool의 모든 리소스를 사용한 상태로 리소스 반환이 없다면, 50초간 대기하게 되고 이후 에러 메시지와 함께, overflow pool에 대해서 종료하게 된다. 명시적으로 세션을 닫지 않는 경우에 유휴 세션이 발생하는 경우가 많기 때문에 사용한 이 후에는 반드시 닫아줘야합니다.

profile
나무와 같이 성장하는 사람

0개의 댓글