Ir al contenido


Foto

Cancelar ejecución


  • Por favor identifícate para responder
6 respuestas en este tema

#1 santiago14

santiago14

    Advanced Member

  • Miembros
  • PipPipPip
  • 334 mensajes
  • LocationCerrillos - Salta - Argentina

Escrito 28 mayo 2015 - 08:35

Buenas, estoy con un dilema.
¿Es posible cancelar la ejecución de una consulta SQL? La cosa es que a veces demora un rato y quisiera que el usuario pueda cancelar.

El código no tiene nada raro, llama a un Select que está en un procedimiento y luego llena una grilla.

Gracias.


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 28 mayo 2015 - 08:45

Buenas, estoy con un dilema.
¿Es posible cancelar la ejecución de una consulta SQL? La cosa es que a veces demora un rato y quisiera que el usuario pueda cancelar.

El código no tiene nada raro, llama a un Select que está en un procedimiento y luego llena una grilla.

Gracias.

 

Umm. que una consulta SQL se demore un rato (habría que definir cuanto es un rato y un ratito  ;)  ) quizá sea síntoma de que algo faltó pulir.

Pero bueno, si tal ejecución no puede optimizarse más o el tiempo de operación es inevitable, lo que yo propondría es mostrar visualmente que el sistema sigue estando opeando y que sea paciente.

Un mensaje tipo "Por favor espere, el sistema está procesando", una barra de proceso sin fin, poner el cursor del mouse en estado loading (el circulito girando o el antiguo reloj de las previas versiones de Windows) o la técnica que tu prefieras para dar aviso de tal operatoria.

 

Saludos,


  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 mayo 2015 - 09:31

Esto se logra en algunos  motores como SQLServer, Oracle, PostgreSQL, expresando el timeout de la transacción, en el que puedes especificar cuanto tiempo esperar para el query.

 

Si  tu caso es en Firebird, este rasgo no existe directamente hasta ahora, creo que será soportado en la versión 3.0. Pero existe una técnica alternativa. http://www.firebirdfaq.org/faq192/

 

Saludos.


  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 28 mayo 2015 - 10:02

Ya no dispongo de Delphi e IBX como para comprobarlo, pero al leer el mensaje de Wilson me hizo recordar que en el componente TIBTransaction es posible establecer algo relacionado con el timeout.

 

Saludos,


  • 0

#5 Azidrain

Azidrain

    Member

  • Miembros
  • PipPip
  • 18 mensajes

Escrito 28 mayo 2015 - 03:21

El query en si no se puede "cancelar", a petición ya se hizo al servidor y este está procesando la información antes de regresar la respuesta. Lo que si podemos hacer es desconectar la sesión, el servidor detecta esta situación y deja de procesar. Mientras tanto nuestra aplicación eleva la excepción correspondiente a la desconexión y si no es tratada termina lo que estaba haciendo sin mostrar nada.

 

Para procesar otras cosas mientras el query esta corriendo, hay que hacer uso de hilos de ejecución y ya eso es un tema por sí solo pues cada hilo necesita su propia conexión y se complica un poco la cosa.

 

Lo más sano es pulir bien la consulta y en su caso informar al usuario cuando pida cosas exageradas como "traer 3 años de facturas"  o cosas así y decirle "Este proceso puede tardar varios minutos, está seguro?" 

 

 


  • 0

#6 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 29 mayo 2015 - 06:05

Hola,  pocas veces un sql demora tanto como para que el usuario se desespere, es probable que sea el proceso y no el sql o que haya que optimizar el diseño del sql,  tal vez limitar el numero de registros que retorna.

 

Pero en respuesta a tu pregunta,  cuando esto ocurre, lo mejor es (si la base de datos lo permite) agregar un timeout, ya que esto mata el proceso directamente en el servidor, liberando recursos como procesador y memoria.

 

Si la base de datos no tiene la opción de timeout, es posible hacer un Hilo, el cual contenga una conexión y un query y  pasado un tiempo, si no responde,  puedes matar el hilo y retornar a la aplicación,   la ventaja es que la aplicación puede seguir respondiendo hasta que el sql termine y no da la sensación de bloqueo.  la desventaja es que el proceso no muere en el servidor y probablemente seguirá ejecutándose hasta terminarlo.

 

Saludos.


  • 0

#7 giulichajari

giulichajari

    Advanced Member

  • Miembros
  • PipPipPip
  • 477 mensajes

Escrito 29 mayo 2015 - 06:14

Bueno me parece que lo que plantean de cancelar la ejecucion podria servir en grandes transferencias de datos, poner a transferir los datos en un momento que se puede y cuando no cortar.

Tambien debes revisar si utilizas transacciones explicitas... al cortar el proceso se realizara un rollback pero debes buscar la manera de no perder lo ya realizado..


  • 0




IP.Board spam blocked by CleanTalk.