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을 조정해줘야한다.
참조
728x90
반응형
'Programming-[Backend] > Database' 카테고리의 다른 글
[TIL] MySQL 사용 관련 주요 팁 모음: 타입, INET_ATON, FK 물리적으로 걸지 않기 (0) | 2024.08.26 |
---|---|
[경험 요약] Atomikos multi-database transaction 묶기 (0) | 2024.05.04 |
[TIL] DB pagination offset 문제, covering index (0) | 2023.08.17 |
[TIL] insert시 ForeignKey에 제한 걸기: DB Trigger 사용 (2) | 2023.07.23 |
[TIL] 😎 MYSQL 필드 최대 길이 정의 varchar 255 vs 191 (0) | 2023.05.04 |