참고 이슈: 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]}
'Python 활용' 카테고리의 다른 글
파이썬, uwsgi 옵션 --master 이용 (0) | 2021.12.29 |
---|---|
파이썬, 스레드 구조 time.sleep() 이용하기 (0) | 2021.12.18 |
Python Oracle 데이터베이스 애플리케이션 프로그래밍(영어 동영상) (0) | 2021.12.13 |
파이썬, 해시(hash) 토큰 값 생성 또는 비밀번호 암호화 (0) | 2021.11.20 |
문장 벡터 기반 유사도 검색시스템 & LSTM을 활용한 텍스트 분류 (0) | 2021.10.22 |