본문 바로가기

Programming-[Backend]/Database

[TIL][link] DB Connection Pooling, context manager

728x90
반응형

DB Connection Pool은 여러 클라이언트의 DB 접속 요청을 위해 미리 세션을 만들어놓고 배분하는 것을 뜻한다. 이렇게 미리 만들어 놓지 않으면 DB는 접속 요청이 올 때마다 세션을 생성하는 작업을 반복해야해서 성능에 좋지 않다.

 

참조 링크 글에서는 connection pool을 설정하지 않거나 설정하고 DB에 연결 요청을 했을 때 소요 시간을 비교한다.

SQLAlchemy를 사용하였으며, 아래 코드에서 poolclass=QueuePool 부분이 ConnectionPool 설정을 해주는 부분이다.

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import QueuePool
from time import time

# Create an SQLite in-memory test database with connection pooling
engine = create_engine('sqlite:///:memory:', poolclass=QueuePool)
# Define a simple User model and create tables
# (Code for creating User model and tables here)
# Time the execution with connection pooling
start_time = time()
# Perform 1000 database queries with connection pooling
Session = sessionmaker(bind=engine)
for _ in range(1000):
    with engine.connect() as connection:
        users = connection.execute('SELECT * FROM users WHERE id < 10').fetchall()
end_time = time()
execution_time = end_time - start_time
print(f"Time taken with connection pooling: {execution_time:.4f} seconds")

 

아쉽게도 글에서 걸리는 시간을 보여주진 않았다. 다만 Connection Pool 설정을 했을 때는 Context Manager가 동작하여 Session을 관리하여 생성 및 파괴에 드는 오버헤드가 없음을 설명한다.

 

최대 Connection Pool 갯수 설정은 DB의 부하 조건에 따라 Scale을 조정해줘야한다.

 

 

참조

https://python.plainenglish.io/mastering-connection-pooling-in-python-optimizing-database-connections-72d66ec2bfcb

 

 

728x90
반응형