Almost-Native

파이썬 프로그램에서 Oracle DB 로 DRCP(공유커넥션풀링) 적용 샘플 본문

Java 프로그램 개발, IT

파이썬 프로그램에서 Oracle DB 로 DRCP(공유커넥션풀링) 적용 샘플

2022. 6. 22. 00:10

DRCP (Database Resident Connection Pooling) 기능은 오라클 데이터베이스에 접속하는 프로그램들을 위한 커넥션 공유풀을 만들어서 공동사용하게 함으로써 DB서버의 자원 사용을 절약하는 기능입니다.

만약 1000개의 프로세스가 DB접속해야 하는 경우, 기본적으로 오라클은 1000개의 클라이언트 처리요청을 지원하기 위해 1000개의 Dedicated Server Process 를 기동합니다.

 

동시 접속이 많은 경우 DB 서버의 자원이 금방 고갈될 수 밖에 없습니다.

이런 것을 해결하기 위해 보통은 WAS (Web Application Server) 차원에서 커넥션풀을 만들어서 DB접속풀 공유하면서 사용하는 것이 일반적입니다.

하지만, WAS 를 사용하지 않는 경우에는 DB 차원에서 이런 "공유 커넥션 풀" 기능을 제공해야 하는데,

오라클 DB에서 2가지 Shared Server 방식DRCP(Database Resident Connection Pooling) 방식입니다.

이들 간의 자세한 차이는 아래 링크를 참조 바랍니다.

 

https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/managing-processes.html#GUID-17E572DA-A048-410A-9C81-744D15867345

 

 

DRCP 기능 사용을 위해서 Database 에서 아래 1, 2 번을 실행해주면 됩니다.

DRCP 기능을 안쓰는 경우 3번 커맨드로 Stop 시켜줍니다.

 

 
------ 1) 설정
SQL> 
begin
  DBMS_CONNECTION_POOL.CONFIGURE_POOL(
    pool_name => 'SYS_DEFAULT_CONNECTION_POOL',
    minsize => 4,
    maxsize => 20,
    incrsize => 2,
    session_cached_cursors => 20,
    inactivity_timeout => 300,
    max_think_time => 600,
    max_use_session => 500000,
    max_lifetime_session => 86400);
end;
/
 
------ 2) Start Pool
SQL> EXECUTE DBMS_CONNECTION_POOL.START_POOL()
 
------ 3) Stop Pool
SQL> EXECUTE DBMS_CONNECTION_POOL.STOP_POOL()
 
------ 4) 설정값 원상 복귀
SQL> EXECUTE DBMS_CONNECTION_POOL.RESTORE_DEFAULTS();
 

 

여기에서는 minsize 4, maxsize 20, incrsize 2 로 잡았습니다.

처음에 4개의 커넥션풀만 기동하고, 부족할때마다 2개씩 띄우는데, 최대 커넥션풀 갯수로 20개로 제한됩니다.

테스트를 위해 극단적으로 잡은 것으로 실제 사용시는 DB 리소스 범위내에서 최대한 크게 잡아주는게 좋습니다.

 

DRCP 를 사용하는 이유는 메모리 자원을 절약하고자 하는 목적입니다.

자원 절약을 위해 결국 늦게 들어온 세션들은 대기(wait)를 발생시키기 때문에 성능이 느려질 수 밖에 없습니다.

 

 

파이썬 프로그램에서도 수정해줘야 하는 부분이 있습니다.

oracledb.connect( ) 함수 사용시 dsn 끝에 :pooled 문구를 삽입해줘야 합니다.

 

 
import oracledb
import time
 
 
oracledb.init_oracle_client()
con = oracledb.connect(user="scott", password="tiger", dsn="192.168.1.171:1521/ORA19:pooled")
cursor = con.cursor()
 
 
cursor.execute("select a.object_name from ALL_OBJECTS a, ALL_OBJECTS b")
while True:
    row = cursor.fetchone()
    if row is None:
        break
    print("=====>", row[0])
    time.sleep(1)
 
con.close()
 

 

위 파이썬 프로그램을 oracle2.py 로 만들고, 이걸 아래와 같이 nohup 으로 100 개를 동시에 수행하였습니다.

 

 

아래와 같이 100개의 파이썬 프로그램이 수행되었습니다.

 

 

DB 에서 Session 갯수를 조회하면 20 개 세션만 붙어있는 것을 확인할 수 있습니다.

 

 

아래는 DRCP 를 적용하지 않고 Dedicated 방식으로 수행했을때의 상황입니다.

100 개 파이썬 프로그램을 위해 100 개의 세션이 붙어있는 것을 확인할 수 있습니다.

 

 

 

Comments