반응형

참고 이슈: https://github.com/oracle/python-cx_Oracle/issues/277

파이썬, 오라클 timeout 설정 테스트

 

정리. 수알치 오상문 

 

오라클 DB 작업을 할 때 타임아웃 시간을 설정할 수 있다.

설정한 시간 안에 작업이 이루어지지 않으면 타임아웃 에러가 발생한다. 

 

강제로 DB에서 지연시키기 위하여 아래 코드를 사용하여 1초간 기다리게 했다. 

cursor.execute("begin dbms_session.sleep(1); end;")  

이 상태에서 쿼리를 요청하면 1초 후에나 응답이 올 것이다. 

 

타임아웃 시간은 conn.callTimeout = time_out에서 설정한다. 

time_out = 300   # 1/1000초 단위 

conn.callTimeout = time_out

 

타임아웃 시간을 300, 1000, 2000으로 바꿔가면서 테스트를 진행했다. 

진행 결과는 예제 코드 뒤에 나와있다.

 


# 오라클 타임아웃 테스트 
import os 
from sys import exit
import cx_Oracle
from datetime import datetime
from fastapi.encoders import jsonable_encoder


user = ["c##sualchi", "cola2004"] 
LOCATION = r"C:\instantclient_21_3" # C:\oracle\instantclient_21_3
os.environ["PATH"] = LOCATION + ";" + os.environ["PATH"] #환경변수 등록


def test_call_time_out_feature():

    try:
        conn = cx_Oracle.connect(user[0], user[1], "127.0.0.1:1521/orcl") # "user/password@xx.xx.xx.xx/xx")
        time_out = 2000  # 타임아웃 시간 milliseconds : 300 --> 1000 --> 2000 결과 확인 
        conn.callTimeout = time_out
    except Exception as e:
        print("DB connection Error: ", e)
        exit(1)  # sys.exit(1)


    req_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
    try:
        cursor = conn.cursor()
        # sql = "insert into emp(ID, order_id) values(:ID, :order_id)"
        # values = ["9300ecd2d9ae46d38194134e72b6325", "600000000000008316122600223247"]
        # cursor.execute(sql, values)
        # count = cursor.rowcount
        # conn.commit()
        
        cursor.execute("begin dbms_session.sleep(1); end;")  # DB Sleep 설정 (1 초)

        cursor.execute("select * from emp")
        res_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")

        data = {}
        for n, row in enumerate(cursor):
            data[n] = jsonable_encoder(row)         
        return data
    except Exception as e:  # excepting callTimeOut exception
        # conn.rollback() # insert, update, ...
        res_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")
        print("DB Error: ", e)
    finally:
        if cursor:
            cursor.close()
        if conn:
            conn.close()
        print("req_time = %s, res_time = %s" %(req_time, res_time))    


if __name__ == "__main__":
    print(test_call_time_out_feature())

[실행 결과] time_out = 300 경우 : 연결 에러 발생!!!
DB Error:  DPI-1080: connection was closed by ORA-3156
Traceback (most recent call last):
  File "c:\fastapi\db_timeout_test.py", line 55, in <module>
    print(test_call_time_out_feature())
  File "c:\fastapi\db_timeout_test.py", line 48, in test_call_time_out_feature
    cursor.close()
cx_Oracle.DatabaseError: DPI-1010: not connected

[실행 결과] time_out = 1000 경우 : 시간초과 에러 발생!!!
DB Error:  DPI-1067: call timeout of 1000 ms exceeded with ORA-3156
req_time = 2021-12-14 13:44:04.009903, res_time = 2021-12-14 13:44:05.011750
None

[실행 결과] time_out = 2000 경우 :  OK! 정상 동작 
req_time = 2021-12-14 13:44:29.723804, res_time = 2021-12-14 13:44:30.727850
{0: [7839, 'KING', 'PRESIDENT', None, '1981-11-17T00:00:00', 5000.0, None, 10], 1: [7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01T00:00:00', 2850.0, None, 30], 2: [7782, 'CLARK', 'MANAGER', 7839, '1981-06-09T00:00:00', 2450.0, None, 10], 3: [7566, 'JONES', 'MANAGER', 7839, '1981-04-02T00:00:00', 2975.0, None, 20], 4: [7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19T00:00:00', 3000.0, None, 20], 5: [7902, 'FORD', 'ANALYST', 7566, '1981-12-03T00:00:00', 3000.0, None, 20], 6: [7369, 'SMITH', 'CLERK', 7902, '1980-12-17T00:00:00', 800.0, None, 20], 7: [7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20T00:00:00', 1600.0, 300.0, 30], 8: [7521, 'WARD', 'SALESMAN', 7698, '1981-02-22T00:00:00', 1250.0, 500.0, 30], 9: [7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28T00:00:00', 1250.0, 1400.0, 30], 10: [7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08T00:00:00', 1500.0, 0.0, 30], 11: [7876, 'ADAMS', 'CLERK', 7788, '1987-05-23T00:00:00', 1100.0, None, 20], 12: [7900, 'JAMES', 'CLERK', 7698, '1981-12-03T00:00:00', 950.0, None, 30], 13: [7934, 'MILLER', 'CLERK', 7782, '1982-01-23T00:00:00', 1300.0, None, 10]}

 

 

반응형

+ Recent posts