Conexión MySQL Interrumpida - ¿Cómo detectarlo?

User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by rolando »

Buenas tardes,

Tengo un sistema "Híbrido". Está hecho con DBF's pero utilizo una conexión con un servidor MySQL (usando la TDolphin de Daniel).

Esta conexión es para enviarle al servidor los datos que son extraídos de las DBF's, pero sólo los necesarios para que los clientes del taller que consultan el sitio web puedan ver el estado de sus reparaciones.

La cuestión es que el internet a veces se corta y cuando se va a actualizar un registro en el servidor se queda en espera un largo rato (si la señal de internet está cortada). Durante ese rato largo, la aplicación, como es lógico, queda impedida de seguirse utilizando. Cuando pasa ese rato, la aplicación informa del error y se puede seguir con ella.

Después de todo lo expuesto viene mi consulta:

¿Se puede detectar rápidamente desde la aplicación cuando la conexión con el servidor MySQL fue interrumpida?

Gracias.

Rolando :D
User avatar
wmormar
Posts: 1050
Joined: Fri Oct 07, 2005 10:41 pm
Location: México
Contact:

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by wmormar »

Rolando,

Puedes aplicarle un oServer:ping() y reconectará en automatico.

Creo que TDolphin la tiene implementada.

Saludos
William, Morales
Saludos

méxico.sureste
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by rolando »

William,

Gracias por responder.

Ya había intentado con el ping(), pero si la conexión con el servidor está interrumpida tarda 19 segundos en indicarlo, lo cual es mucho tiempo para lo que necesito.

No es lo que quiero en realidad, pero por ahora voy a implementar una función de FWH , la "isinternet()" la cual demora 2 segundos en detectar la falta de internet en la red.

Como dije, no es lo que quiero. Lo que deseo es saber si se interrumpió la conexión con el server pero en un tiempo no mayor a los dos segundos.

Saludos y feliz día del trabajador al igual que para todos los colegas del foro.

Rolando :D
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by Daniel Garcia-Gil »

Hola

no hay forma automatica que mysql te envie una señal que se corto la comunicacion...

lo que yo implemento es lo siguiente...
1) funcion que me ejecuta los "queries", otra los "execute" de mi aplicacion
2) crear un timer, que esta siempre activo, que envia un ping cada "x" cantidad de segundos si existe un error en el proceso, activo un flag de reconexion, reconecto, apago el flag de reconexion... y como todos los queries y execute pasan por una funcion propia (punto 1) si el flag de reconexion esta activo espero hasta que cambie de estado para ejecutar la sentencia
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by rolando »

Daniel,

Gracias por tu respuesta.

Voy a intentarlo de la manera que sugieres.

Saludos.

Rolando :D
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by rolando »

Daniel,

Estoy intentando hacerlo como dices pero resulta el mismo problema.

Implementé un timer que llama a una función y, en esta función, hago el

Code: Select all

oServer:ping()
Mientras el server este activo, no hay problemas porque es prácticamente "nada" lo que tarda en ejecutar el ping, pero si se da que la conexión con el server está cortada, el ping demora los 19 segundos antes de indicar un error y durante ese tiempo la aplicación queda bloqueada (no puede seguir mientras se ejecuta el oServer:ping()).

Ó quizás no entendí bien lo que me indicas. Gracias.

Rolando :D
User avatar
quique
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am
Contact:

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by quique »

No tengo idea de la solución de tu problema, pero se me ocurre que si el problema de la conexión con el servidor es a consecuencia de una falla en la conexión de internet ¿porque no creas un programa que te permita conectarte por un socket TCP/IP en el servidor? cuando realices la conexión con mysql te conectas también con el programa que te digo, en lugar de realizar ping con el servidor mysql revisa si se pierde la conexión alterna, si tu soket se desconecta sería el equivalente quiere decir que hay que volverse a conectar a mysql.
Saludos
Quique
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by rolando »

Quique,

Gracias por responder.

La idea que planteas está correcta. Es lo mismo que dije de hacer usando la función FWH isinternet().

También podría ejecutar un php que tengo en el server para indicarme la ip pública de la red, pero esto tiene un tiempo de espera cuando se corta la conexión, que si bién es menor que el de un ping(), igual influye en el comportamiento de la aplicación, que como explicara, es híbrida y utiliza para todo DBF's con ADS en forma local. El MySQL se utiliza sólo para actualizar datos en un servidor externo y esos datos son usado en las consultas de los clientes del taller.

Por esto, cuando se guardan cambios en el estado de una reparación, _ van a una DBF pero además parte de _ se pasan a la bd mysql y, cuando la conexión está cortada (gracias a Dios no es siempre), demora 19 segundos en devolver el control a la aplicación luego de lo cual se detecta el error y se sigue con la aplicación.

Es un tema medio complicado por como lo uso. Supongo que lo que me sugería Daniel es porque él usa Harbour y tengo entendido que se puede usar multihilo, yo uso y tengo todo el sistema en xHarbour (no tiene multihilo).

Ya voy a ver como lo soluciono, calculo que haré otra aplicación dedicada a verificar la conexión al server informando de esto en algún archivo MEM para que pueda ser leído por la aplicación principal.

Saludos.

Rolando
User avatar
quique
Posts: 408
Joined: Sun Aug 13, 2006 5:38 am
Contact:

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by quique »

xharbour utiliza multihilo mucho antes que harbour, aunque no se si ya lo hayan corregido, pero tuve problemas al trabajar con fivewin y multihilos en xharbour, con harbour hasta ahorita no, pero ya casi no los uso.

La función isInternet() detecta la conexión contra la página de microsoft, lo que te sugerí es únicamente revisar la conexión contra el servidor de mysql, puede ser que la conexión se haya perdido momentaneamete y cuando revisas si isinternet() funciona ya se recuperó la conexión, pero bueno, era una idea, todavia habría que ver si funciona :p
Saludos
Quique
User avatar
TOTOVIOTTI
Posts: 334
Joined: Fri Feb 05, 2010 11:30 am
Location: San Francisco - Córdoba - Argentina

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by TOTOVIOTTI »

Daniel
cada cuanto tiempo tu sugieres que se le haga ping a la base?
Yo lo hago cada 5 minutos, es mucho tiempo?
Gracias
Univ@c I.S.I.
Desarrolladores de Software
http://www.elcolegioencasa.edu.ar
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by rolando »

Hola TOTOVIOTTI,

Me podrías indicar como implementas el ping al servidor?

Si no lo haces desde multihilo, cuando la conexión se interrumpe, demora 19 segundos (una eternidad) en devolver el control al sistema.

Por esto te consulto, quizás yo no lo sepa hacer y tu sí. Gracias.

Rolando :D
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by Daniel Garcia-Gil »

Hola

les comento que hacer ping al parecer no hace efecto alguno en mantener viva la conexion

probe de esta manera y me funciona bastante bien

Code: Select all

define timer hObjs[ "TMR" ] interval 300000 /*5 minutos*/ of hObjs[ "MAIN" ];
          action oSelf:StillAlive() 
          
activate timer hObjs[ "TMR" ]
   

METHOD StillAlive() CLASS prog

   hObjs[ "TMR" ]:deactivate()
   if ! hObjs[ "SERVER" ]:Execute( "SET @dummy=0" )
      //Colocal aqui las medidas a tomar si se pierde la conexion  
   endif
return nil
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
rolando
Posts: 593
Joined: Sat May 12, 2007 11:47 am
Location: San Nicolás - BA - ARGENTINA

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by rolando »

Daniel,

Intenté hacerlo como indicas pero me da distintos errores.

Interpreto (quizás mal) que lo más importante sería el

Code: Select all

if ! oServer:Execute( "SET @dummy=0" )
Lo puse dentro de una función que llamo al presionar un botón y hace lo siguiente:

- Si la conexión con el server está bién, la aplicación sigue normalmente.

- Si la conexión con el servidor está interrumpida, demora los 20 segundos y luego se pierde dando error la aplicación.

Saludos.

Rolando :D
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by Daniel Garcia-Gil »

rolando wrote:Intenté hacerlo como indicas pero me da distintos errores.
Cuales errores?
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Conexión MySQL Interrumpida - ¿Cómo detectarlo?

Post by Daniel Garcia-Gil »

rolando wrote:CODE: SELECT ALL  EXPAND VIEW
if ! oServer:Execute( "SET @dummy=0" )
colocalo dentro de un try/catch
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
Post Reply