출처: Wiki |
Database에 연결을 진행하는 경우, 세션을 생성하기 위한 TCP-Handsake 로 인해서 연결하는데 시간이 필요해진다.
즉 실제 Data를 전송하기 전에, 네트워크 연결 작업을 위해 0.2초 가량의 시간을 소비하게 된다.
Database에 데이터를 자주 접근하지 않는 경우 문제가 되지 않지만, 만약 자주 접근해야 한다면, 네트워크 연결을 위한 시간으로 인해 지연이 발생할 가능성이 높아진다.
이를 해결 할 수 있는 방법이 바로 Pool로써, 기존에 연결된 세션을 재사용하는 것이다.
Pool 개념은 사전에 Database에 지정한 여러개의 세션을 연결해두고, 해당 세션을 활용하는 방법이다.
세션을 활용하게 되면, 기존에 연결된 세션을 재사용하기 때문에, 네트워크 연결에 걸리는 시간이 줄어 지연 문제를 손쉽게 해결 할 수 있다.
그럼 Sqlalchemy을 이용해서 Pool 구조로 생성하는 방법을 알아보자.
Pool 연결을 하기 위해서는 sessionimaker를 활용하여, session으로 관리할 것이라는 것을 지정해주고, pool 크기등을 지정해주면, Pool 관리에 용이하다.
Session을 생성하기 위한 기초 코드는 다음과 같다.
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
# 데이터베이스 연결 정보 설정
DB_HOST = 'localhost'
DB_PORT = 3306
DB_USER = 'username'
DB_PASSWORD = 'password'
DB_NAME = 'database_name'
# 데이터베이스 연결 URL 생성
DB_URL = f"mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}"
# 엔진 생성
DB_ENGINE = create_engine(DB_URL, pool_size=5, max_overflow=10)
# 세션 생성
DB_SESSION = sessionmaker(bind=DB_ENGINE)
SESSION = DB_SESSION()
이후 Database의 SQLAlchemy가 테이블 구조를 인식할 수 있도록 Base = declarative_base() 를 활용해 테이블 구조를 클래스로 생성하여 주도록 하자.
from sqlalchemy import Column, String, DateTime
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Post(Base):
__tablename__ = 'post'
id = Column(Integer, primary_key=True)
name = Column(String(50))
content = Column(String(500))
created_at = Column(DateTime)
# Base 기반으로 구성한 class를 Table Metadata로 인식
Base.metadata.create_all(engine)
이제 기본적인 작업은 완료되었다.
앞서 작성한 SESSION 객체를 활용해 Post를 작성하고자 한다면, 다음과 같이 사용할 수 있다.
new_post = Post(name='Asecurity', content='SQLalchemy Pool 을 이용한 세션 재사용')
SESSION.add(new_post)
SESSION.commit()
# 사용이 완료되면, 해당 세션을 닫는다.
SESSION.close()
0 댓글