Cancelar consulta después de esperar cierto tiempo sin respuesta.

Hola a todos soy nuevo en el Foro, antes que todo para felicitar a los administradores de esta pagina, es bastantemente buena(de aqui he tomado algunas soluciones o indicios para solucionar problemas) :).

 

Tengo un tema con un procedure en Oracle, en el cual he buscando información al respecto y no logro dar con alguna solución, paso a explicar lo siguiente:

 

Quiero hacer la cancelación de una consulta dentro de un store, si esta no se lleva en cierto tiempo, es decir ejecuto la consulta(ejemplo):

 

select * from empleados (con o sin condiciones) y si esta no se lleva acabo(que regrese datos) en un lapso de tiempo por decir algo en 10 segundos realice alguna otra tarea.

 

Esto lo estoy ocupando en realidad para una consulta del tipo 

select UTL_HTTP.REQUEST('http://192.168.1.168:8080/validoPagina') into XVALOR from dual;

 

que se encuentra en un procedure que es ejecutado por un JOB cada cierto tiempo y esta devuelve valores en caso de que el web application este "Arriba" , pero he notado que aun y cuando esta arriba el WEB APPLICATION(tomcat) esta consulta se queda en realidad esperando una respuesta y empieza a correr el tiempo, desde 1... hasta que la cancelo graficamente por el toad, aclaro este parte es exporadita, por lo regular siempre regresa datos y cuando la aplicación o el servidor se encuentra "fuera" siempre regresa un error del tipo 404, ya sea que regrese datos "buenos" o el error 404 siempre en menos de 2 segundos, pero las veces que no lo hace, esta consulta se queda esperando respuesta por mucho tiempo.

 

Posible solución que pude haber implementado:

Dentro del Procedure, tomar una fecha inicial y una fecha final, de ahi sacar el diferencial del tiempo y hacer "otras" tareas.

 

No se lleva acabo esta solución, por que simplemente si la consulta se queda indefinidamente esta no podra obtener la fecha final y hacer la diferencia para poder hacer la otra tarea.

 

No se si exista alguna excepción por tiempo en el cual si cumple 5,6, o 15 segundos y aun no ha salido de hacer su tarea esta se levante realizando otra tarea(un envio de mail tarea que ya hace en caso de que conteste un 404).

 

He visto algunas cosas como el alter kill session, pero creo no es muy viable, o el hecho de mover el tiempo de respuesta o conexión hacia la BD, pero igual no es opción, por que hay consultas(joins) muy grandes que estan necesitan almenos unos 10s o mas para regresar datos.

 

Agradeceria si me pudieran orientar con algo o como solventar este issue, por mi parte seguire buscando algo al respecto.

 

Hola Esteban

Yo creo que la opción de acotar el tiempo de respuesta te puede ir muy bien, y si otras consultas necesitan un tiempo mayor podrías crear una sesión sólo para lanzar este procedure, y modificar los parámetros sólo para esta sesión.

Con Alter Session puedes definir un Timeout para las consultas, te copio una parte de la referencia de SQL para ALTER SESSION:

RESUMABLE Clauses

These clauses let you enable and disable resumable space allocation. This feature allows an operation to be suspended in the event of an out-of-space error condition and to resume automatically from the point of interruption when the error condition is fixed.

ENABLE RESUMABLE

This clause enables resumable space allocation for the session.

TIMEOUT TIMEOUT lets you specify (in seconds) the time during which an operation can remain suspended while waiting for the error condition to be fixed. If the error condition is not fixed within the TIMEOUT period, then Oracle Database aborts the suspended operation.

 

De todas maneras yo revisaría igualmente el parámetro IDLE_TIMEOUT de la base de datos, que si está a 0 no limita por Timeout las consultas, cosa que a veces puede provocar problemas. Si lo ajustas a un tiempo razonable, siempre teniendo en cuenta los tiempos máximos de las consultas que se hagan en producción, te aseguras de que ninguna consulta se quede 'colgada' demasiado tiempo.

 

Saludos,

En respuesta a por Carlos

Hola Carlos, 

 

Agradezco tu interes por ayudarme, esto es a lo que me refiero, con que dan buenas pistas para poder resolver nuestros issues, en efecto estuve revisando el Alter session ENABLE RESUMABLE  timeout y pienso que es una muy buena opción y de hecho bastante sencilla, segun lo que entendi de este tipo de instrucción realiza una reanudación tras un "Error" o bien tras algo que sucedio con la instrucción que se estaba ejecutando, si bien no conocia esta funcionalidad( y desconozco muchas mas) me ayudo :) .

 

Sin mas lo que hice fue colocar la siguiente sentencia en mi store:

execute immediate 'ALTER SESSION ENABLE RESUMABLE TIMEOUT 10';

Antes de esto tuve que darle permisos:

 GRANT RESUMABLE TO USUARIO;

 

Hasta este punto mi JOB junto con el STORE esta trabajando sin problemas y realiza los trabajos como se tienen planeados, solo falta que haga su tarea cuando esta tarde mas de los 10 segundos que le coloque.

 

Y de nueva cuenta te felicito por tu conocimiento y tu interes por ayudar a los demas, si puedes recomendarme algunas lecturas para poder ir aprendiendo mas te lo agradeceria.

 

Saludos!!!.

En respuesta a por Esteban

Hola Esteban

 

Me alegro de poder servirte de ayuda, y gracias a ti por compartir tu experiencia, la idea es que entre todos podamos tener un buen repositorio de recursos.

Espero que la solución funcione correctamente cuando se produzca la espera.

Sobre recomendaciones, entiendo que sobre administración de Oracle, te enlazo este manual de recopilación, que es como un índice de las mejores publicaciones sobre Oracle en Dataprix.

Verás que la mayoría son de hace tiempo, de la época en que yo trabajaba más con Oracle, pero seguro que casi todas aún sirven.

Saludos!