programing

Python에서 데이터베이스 연결 시간 초과 설정

newstyles 2023. 7. 23. 14:06

Python에서 데이터베이스 연결 시간 초과 설정

데이터베이스에 액세스해야 하는 RESTful API를 만들고 있습니다.레스티쉬, 오라클, SQL 화학을 사용하고 있습니다.하지만 Restish나 다른 웹 API를 고려하지 않고 가능한 한 일반적으로 질문을 구성하도록 노력하겠습니다.

쿼리를 실행하는 연결에 대한 시간 초과를 설정할 수 있습니다.이는 장시간 실행 중인 쿼리가 포기되고 연결이 삭제(또는 재사용)되도록 하기 위한 것입니다.이 쿼리 시간 초과는 글로벌 값이 될 수 있습니다. 즉, 쿼리 또는 연결 만들기별로 변경할 필요가 없습니다.

다음 코드가 주어집니다.

import cx_Oracle
import sqlalchemy.pool as pool

conn_pool = pool.manage(cx_Oracle)
conn = conn_pool.connect("username/p4ss@dbname")
conn.ping()

try:
    cursor = conn.cursor()
    cursor.execute("SELECT * FROM really_slow_query")
    print cursor.fetchone()
finally:
    cursor.close()

위의 코드를 수정하여 쿼리 시간 초과를 설정하려면 어떻게 해야 합니까?이 제한 시간은 연결 작성에도 적용됩니까?

이는 java.sql과 유사합니다.문의 setQueryTimeout(intseconds) 메서드는 Java에서 수행됩니다.

감사해요.

쿼리를 위해, 당신은 타이머와 conn.timeout 호출을 볼 수 있습니다.

다음 줄에 있는 무언가:

t = threading.Timer(timeout,conn.cancel)
t.start()
cursor = conn.cursor()
cursor.execute(query)
res =  cursor.fetchall()
t.cancel()

Linux의 경우 /etc/oracle/sqlnet.ora,

sqlnet.outbound_connect_timeout= value

옵션도 있습니다.

tcp.connect_time 및 sqlnet.time, 행운을 빕니다!

Oracle에서 특정 개수의 logical_reads_per_call 및/또는 cpu_per_call 후 쿼리를 종료하도록 PROFILE을 설정할 수 있습니다.

Windows 11의 경우 아래 줄sqlnet.ora연결 중에 해당 시간 초과가 발생했습니다.

tcp.connect_timeout=3

베타루가 지적한 바와 같이

시스템 경보를 사용한 시간 초과

운영 체제 제한 시간을 사용하여 이 작업을 수행하는 방법은 다음과 같습니다.일반적이며 Oracle 이외의 용도로도 사용할 수 있습니다.

import signal
class TimeoutExc(Exception):
    """this exception is raised when there's a timeout"""
    def __init__(self): Exception.__init__(self)
def alarmhandler(signame,frame):
    "sigalarm handler.  raises a Timeout exception"""
    raise TimeoutExc()

nsecs=5
signal.signal(signal.SIGALRM, alarmhandler)  # set the signal handler function
signal.alarm(nsecs)                          # in 5s, the process receives a SIGALRM
try:
    cx_Oracle.connect(blah blah)             # do your thing, connect, query, etc
    signal.alarm(0)                          # if successful, turn of alarm
except TimeoutExc:
    print "timed out!"                       # timed out!!

언급URL : https://stackoverflow.com/questions/2374079/set-database-connection-timeout-in-python