작성
·
42
·
수정됨
0
강의에서는 비동기적으로 engine을 만들때, 아래 처럼
engine = create_async_engine(
DATABASE_URL,
echo=True,
future=True, # SQLAlchemy 2.0
# encoding="utf-8"
)
했는데.... poolclass=QueuePool를 사용하여, DB 연결을 풀링하여 재사용하는 것이 도움이 될 듯한데... 강의에서는 언급이 없으셔서, AI에게 물어봤더니...
"FastAPI에서 create_async_engine
과 함께 QueuePool
을 사용하는 것은 비동기 데이터베이스 연결을 효율적으로 관리하기 위함입니다. QueuePool
은 데이터베이스 연결을 풀링하여 재사용함으로써, 매번 새로운 연결을 생성하고 종료하는 오버헤드를 줄여줍니다. 특히 FastAPI와 같이 비동기 요청을 처리하는 환경에서는 여러 연결을 동시에 관리해야 하므로, 풀링은 성능 향상에 큰 도움이 됩니다."
이렇게 답을 주고...
from sqlalchemy.ext.asyncio import create_async_engine
from sqlalchemy.pool import QueuePool
DATABASE_URL = "your_database_url" # 예: postgresql+asyncpg://user:password@host:port/database
engine = create_async_engine(
DATABASE_URL,
poolclass=QueuePool,
pool_size=10, # 풀에 유지할 연결 수
max_overflow=20, # 풀 크기가 초과될 때 허용할 추가 연결 수
pool_recycle=3600, # 초 단위로 연결을 재활용할 시간 (초과 시 재연결)
echo=True # SQL 실행 로그 출력 (디버깅용)
)
# 이후 엔진을 사용하여 데이터베이스 작업 수행
예시코드로 이렇게 주던데...
실제로, 비동기적으로 engine을 만들때에 AI의 답변처럼 도움이 되나요?
저희 강의의 코드는 아래와 같은 흐름을 타고 있던데...
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker, declarative_base
from typing import AsyncGenerator
from sqlalchemy.orm import configure_mappers
configure_mappers()
DATABASE_URL = "sqlite+aiosqlite:///./sql_app.db?charset=utf8"
engine = create_async_engine(
DATABASE_URL,
echo=True,
future=True, # SQLAlchemy 2.0
# encoding="utf-8"
)
from sqlalchemy.ext.asyncio import async_sessionmaker
AsyncSessionLocal = async_sessionmaker(
engine,
class_=AsyncSession, # add
expire_on_commit=False,
autocommit=False,
autoflush=False
)
Base = declarative_base()
async def get_db() -> AsyncGenerator[AsyncSession, None]:
session: AsyncSession = AsyncSessionLocal()
print(f"async def get_db(): Session created: {session}")
try:
yield session
except Exception as e:
print(f"Session rollback triggered due to exception: {e}")
await session.rollback()
raise
finally:
print(f"async def get_db(): Closing session: {session}")
await session.close()
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
moljin님, FastAPI에서 비동기적으로 데이터베이스 연결을 관리할 때 QueuePool
을 사용하는 것이 성능 향상에 도움이 될 수 있습니다. QueuePool
은 데이터베이스 연결을 일정한 수로 풀링하여, 매번 새로운 연결을 생성하고 닫는 오버헤드를 줄여줍니다. 이는 비동기 방식으로 여러 요청을 처리할 때 특히 유용합니다.
강의에서 사용하는 코드에서는 엔진을 생성할 때 풀링에 대한 세부 설정이 없지만, QueuePool
을 설정하면 데이터베이스 연결을 더 효율적으로 관리할 수 있습니다. 특히 많은 동시 연결을 처리해야 하는 환경에서는 풀 옵션을 지정해주는 것이 유리합니다.
사용하려는 데이터베이스와 애플리케이션의 요구사항에 따라 풀 크기나 재활용 주기를 조정할 수 있습니다. 기본 설정 대신 QueuePool
의 구성을 통해 성능을 높일 수 있다는 점 참고하세요.
용도나 성능 요구 사항에 따라 풀링을 추가적으로 활용해 보실 수 있습니다. FastAPI와 비동기 데이터베이스 연결을 최적화하는 방법은 프로젝트의 특정 요구 사항에 맞게 조정될 수 있습니다.
추가로 관련된 공식 문서 내용을 확인하고 싶으시면, 아래 링크를 방문해 보세요:
Spring Boot Reference Documentation - Supported Connection Pools