행위

Python 오라클 연결 cx oracle

DB CAFE

Dbcafe (토론 | 기여)님의 2023년 6월 1일 (목) 15:45 판 (= fetchone() 함수를 사용하여 1건 패치)
thumb_up 추천메뉴 바로가기


1 개요[편집]

cx_Oracle_arch.png


2 접속 모듈 설치[편집]

pip install cx_Oracle

2.2 접속 테스트[편집]

import cx_Oracle

#한글 지원 방법
import os
os.putenv('NLS_LANG', '.UTF8')

#연결에 필요한 기본 정보 (유저, 비밀번호, 데이터베이스 서버 주소)
connection = cx_Oracle.connect('Id','password','localhost/orcl')

# 오라클 버전 확인 
print("Database version:", connection.version)
print("Client version:", cx_Oracle.clientversion())

# 커셔 연결 
cursor = connection.cursor()

cursor.execute("""
   select name
   from test_db
   where text = :texting""",
   texting = "테스트"
)

for name in cursor:
   print("테스트 이름 리스트 : ", name)


# 종료
cursor.close()
connection.close()

2.3 커넥션 풀 사용하기[편집]

import cx_Oracle
import threading
import db_config

pool = cx_Oracle.SessionPool(db_config.user, db_config.pw, db_config.dsn,
                             min = 2, max = 5, increment = 1, threaded = True,
                             getmode = cx_Oracle.SPOOL_ATTRVAL_WAIT)

def Query():
    con = pool.acquire()
    cur = con.cursor()
    for i in range(4):
        cur.execute("select myseq.nextval from dual")
        seqval, = cur.fetchone()
        print("Thread", threading.current_thread().name, "fetched sequence =", seqval)

numberOfThreads = 2
threadArray = []

for i in range(numberOfThreads):
    thread = threading.Thread(name = '#' + str(i), target = Query)
    threadArray.append(thread)
    thread.start()

for t in threadArray:
    t.join()

print("All done!")

2.4 DRCP 커넥션풀 사용하기[편집]

  1. DRCP (Database Resident Connection Pooling) 기능은 DB 접속을 위한 커넥션 공유풀을 공동사용하게 함으로써 DB 서버의 자원 사용을 절약하는 기능
  2. 만약 1000개의 프로세스가 DB 접속 하는 경우, 기본적으로 1000개의 클라이언트 처리요청을 지원하기 위해 1000개의 Dedicated Server Process 를 기동 해야함
  3. WAS 를 사용하지 않는 경우, DB 차원에서 이런 "공유 커넥션 풀" 기능을 제공
  4. 오라클 DB에서 2가지 Shared Server 방식과 DRCP(Database Resident Connection Pooling) 방식 제공


  • 동시 접속이 많은 경우 DB 서버의 자원이 금방 고갈될 수 밖에 없는 문제를 해결하기 위해 보통은 WAS (Web Application Server) 차원에서 커넥션풀을 만들어서 DB접속풀 공유하면서 사용하는 것이 일반적임.
import cx_Oracle
import threading

pool = cx_Oracle.SessionPool(db_config.user, db_config.pw, db_config.dsn + ":pooled",
                             min = 2, max = 5, increment = 1, threaded = True,
                             getmode = cx_Oracle.SPOOL_ATTRVAL_WAIT)

def Query():
    con = pool.acquire(cclass = "PYTHONHOL", purity = cx_Oracle.ATTR_PURITY_SELF)
    cur = conn.cursor()
    for i in range(4):
        cur.execute("select myseq.nextval from dual")
        seqval, = cur.fetchone()
        print("Thread", threading.current_thread().name, "fetched sequence =", seqval)

numberOfThreads = 2
threadArray = []

for i in range(numberOfThreads):
    thread = threading.Thread(name = '#' + str(i), target = Query)
    threadArray.append(thread)
    thread.start()

for t in threadArray:
    t.join()

print("All done!")

2.5 fetchone() 함수를 사용하여 1건 패치[편집]

  • 로우갯수가 많을때 fetchall() 함수는 너무 많은 메모리
import cx_Oracle
import db_config

con = cx_Oracle.connect(db_config.user, db_config.pw, db_config.dsn)
cur = con.cursor()

cur.execute("select * from dept order by deptno")
row = cur.fetchone()
print(row)

row = cur.fetchone()
print(row)

2.6 fetchmany() 사용하여 다건 패치[편집]

import cx_Oracle
import db_config

con = cx_Oracle.connect(db_config.user, db_config.pw, db_config.dsn)
cur = con.cursor()

cur.execute("select * from dept order by deptno")
res = cur.fetchmany(numRows = 3)
print(res)