메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Oracle 접속 커넥션풀

데브카페
Devcafe (토론 | 기여)님의 2025년 5월 21일 (수) 06:00 판 (새 문서: Oracle DB가 여러 개일 경우, 각 DB에 대해 별도의 Connection Pool을 생성하고 관리할 수 있도록 코드를 수정해야 합니다. 아래는 여러 DB에 대한 접속을 처리할 수 있도록 확장한 버전입니다. ⸻ 1. 여러 DB 정보를 dict로 관리 import cx_Oracle # 접속할 여러 DB 정보 (key는 식별자) DB_CONFIGS = { "DB1": { "user": "user1", "password": "pass1", "dsn": "host1:1521/service1" },...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)

Oracle DB가 여러 개일 경우, 각 DB에 대해 별도의 Connection Pool을 생성하고 관리할 수 있도록 코드를 수정해야 합니다. 아래는 여러 DB에 대한 접속을 처리할 수 있도록 확장한 버전입니다.

1. 여러 DB 정보를 dict로 관리

import cx_Oracle

  1. 접속할 여러 DB 정보 (key는 식별자)

DB_CONFIGS = {

   "DB1": {
       "user": "user1",
       "password": "pass1",
       "dsn": "host1:1521/service1"
   },
   "DB2": {
       "user": "user2",
       "password": "pass2",
       "dsn": "host2:1521/service2"
   },
   # 필요 시 더 추가

}


2. Connection Pool 생성 함수

def create_connection_pools(db_configs):

   pools = {}
   for name, config in db_configs.items():
       try:
           pool = cx_Oracle.SessionPool(
               user=config["user"],
               password=config["password"],
               dsn=config["dsn"],
               min=2,
               max=5,
               increment=1,
               encoding="UTF-8"
           )
           pools[name] = pool
           print(f"[{name}] Connection pool created.")
       except cx_Oracle.Error as e:
           print(f"[{name}] Failed to create connection pool: {e}")
   return pools


3. 테스트 쿼리 함수

def test_query(pool, db_name):

   try:
       conn = pool.acquire()
       cursor = conn.cursor()
       cursor.execute("SELECT SYSDATE FROM dual")
       result = cursor.fetchone()
       print(f"[{db_name}] Current DB time: {result[0]}")
       cursor.close()
       pool.release(conn)
   except cx_Oracle.Error as e:
       print(f"[{db_name}] Query failed: {e}")


4. 메인 실행부

if __name__ == "__main__":

   pools = create_connection_pools(DB_CONFIGS)
   for db_name, pool in pools.items():
       test_query(pool, db_name)
   # 모든 커넥션 풀 닫기
   for pool in pools.values():
       pool.close()


실행 결과 예시

[DB1] Connection pool created. [DB2] Connection pool created. [DB1] Current DB time: 2025-05-21 12:34:56 [DB2] Current DB time: 2025-05-21 12:35:01


보충 설명 • 이 구조는 DB 수가 많아도 확장성이 좋습니다. • 필요 시 try-except로 개별 DB 실패에 따른 예외 처리를 분리할 수 있습니다. • pools는 전역 상태로 관리할 수 있으므로 이후에도 재사용이 가능합니다.

원한다면, 이 구조를 클래스로 리팩토링하거나, Flask 등의 웹 서버 환경에 통합하는 방법도 제공할 수 있어요.

Comments