Estoy creando una API RESTful que necesita para acceder a la base de datos. Estoy usando Restish, Oracle, y SQLAlchemy. Sin embargo, voy a tratar de marco mi pregunta como genéricamente como sea posible, sin tomar Restish o de otros web Api en cuenta.

Me gustaría ser capaz de establecer un tiempo de espera para una conexión de ejecución de una consulta. Esto es para asegurar que las consultas de larga ejecución son abandonados, y la conexión se descarta (o reciclado). Este tiempo de espera de consulta puede ser un valor global, es decir, no necesito cambiarlo por consulta o de creación de la conexión.

Dado el siguiente código:

import cx_Oracle
import sqlalchemy.pool as pool

conn_pool = pool.manage(cx_Oracle)
conn = conn_pool.connect("username/[email protected]")
conn.ping()

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

¿Cómo puedo modificar el código anterior para establecer un tiempo de espera de consulta?
Será este tiempo de espera también se aplican a la creación de la conexión?

Esto es similar a lo de java.sql.Declaración del setQueryTimeout(int segundos) método en Java.

Gracias

Hola, veo que ninguno las respuestas es aceptado hizo u a encontrar otra solución para esto?
No, no he sido capaz de hacer este trabajo. Las soluciones propuestas hasta ahora simplemente no funcionan.
¿Por qué no conn.cancel() trabajo? ¿Qué sucede cuando se trate de Dmitry la solución?
Yo no he tenido la oportunidad de probar Dmitry la solución. (Me mudé a otra cosa desde entonces.) Si alguien agrega un comentario que he probado, puedo aceptar esa solución.
Dmitry la solución trabajó como un encanto! Después de que el tiempo de espera me sale un «ORA-01013: el usuario solicita cancelar de operación actual». Así que me gustaría aceptar que responder

OriginalEl autor oneself | 2010-03-03

4 Comentarios

  1. 13

    para la consulta, usted puede mirar en el temporizador y conn.cancelar ().

    algo en esas líneas:

    t = threading.Timer(timeout,conn.cancel)
    t.start()
    cursor = conn.cursor()
    cursor.execute(query)
    res =  cursor.fetchall()
    t.cancel()
    Esto funciona tan bien, gracias ! Esta es la forma en que me puede matar mi tiempo de ejecución de las solicitudes.

    OriginalEl autor Dmitry Khrisanov

  2. 3

    En linux ver /etc/oracle/sqlnet.ora,

    sqlnet.outbound_connect_timeout= value

    también tienen opciones:

    tcp.connect_timeout y sqlnet.expire_time, buena suerte!

    Creo que esto es para la conexión, no la ejecución de la instrucción.
    Es una solución de trabajo, intentarlo 😉

    OriginalEl autor BetarU

  3. 0

    Usted podría mirar a la creación de PERFILs en Oracle para terminar las consultas después de un cierto número de logical_reads_per_call y/o cpu_per_call

    OriginalEl autor Gary Myers

  4. -3

    Tiempo de espera con el Sistema de Alarma

    Aquí es cómo utilizar el sistema operativo de tiempo de espera para ello. Es genérico, y funciona para otras cosas a parte de 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!!
    Esto no parece funcionar. Oracle no sea interrumpida.
    De curso de Oracle (en el servidor) no se interrumpe — usted dijo que quería «abandonar la consulta de larga duración», que significa que usted simplemente renunciar a la espera de la respuesta. Si quieres realmente hacer de Oracle detener la ejecución de la consulta, eso es otra cosa, y no es tan fácil, tiene que «matar a la sesión» en el servidor…
    Lo que yo quise decir es que la consulta sigue funcionando sin interrupciones en el cliente.
    FWIW, he intentado utilizar la señal en el contexto de una aplicación de Django intentando conectarse() a una base de datos. la señal produce una excepción, quejándose de que sólo puede ser utilizado en el hilo principal & Django multithreads el tratamiento de la petición.

    OriginalEl autor Mark Harrison

Dejar respuesta

Please enter your comment!
Please enter your name here