Установить время ожидания подключения к базе данных в Python - PullRequest
11 голосов
/ 03 марта 2010

Я создаю RESTful API, которому необходим доступ к базе данных. Я использую Restish, Oracle и SQLAlchemy. Однако я постараюсь сформулировать свой вопрос как можно более обобщенно, не принимая во внимание 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.Statement setQueryTimeout (int seconds) делает в Java.

Спасибо

Ответы [ 4 ]

13 голосов
/ 04 июня 2010

для запроса, вы можете посмотреть таймер и вызов conn.cancel ().

что-то в этих строках:

t = threading.Timer(timeout,conn.cancel)
t.start()
cursor = conn.cursor()
cursor.execute(query)
res =  cursor.fetchall()
t.cancel()
3 голосов
/ 27 сентября 2012

В Linux см. /Etc/oracle/sqlnet.ora,

sqlnet.outbound_connect_timeout= value

также есть опции:

tcp.connect_timeout и sqlnet.expire_time, удачи!

0 голосов
/ 11 марта 2010

Тайм-аут с системным аварийным сигналом

Вот как использовать тайм-аут операционной системы для этого. Он универсален и работает не только для 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!!
0 голосов
/ 04 марта 2010

Вы можете посмотреть, как настроить PROFILE s в Oracle, чтобы завершать запросы после определенного числа логических_представлений_per_call и / или cpu_per_call

...