Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Problema Con Timeout De Mysql
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Problema Con Timeout De Mysql 
 
Hola,

  Tengo un problema con mi aplicación, y es que si la dejo ejecutando, al día siguiente me da un fallo del mysql. Lo que pasa es que se pierde la conexión (timeout del mysql). Yo lo que hago es cuando entro al programa abro una conexión y solo la cierro al cerrar el programa, pero si no lo cierro tal y como hago ahora me da el fallo. No se si la mejor solución a esto sería abrir conexión cada vez que vaya a ejecutar una sentencia sql y cerrarla justo después.

¿Que opináis?
 



 
karpaga - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Problema Con Timeout De Mysql 
 
Personalmente utilizo una clase que extiende la clase connection. La llamo conexion, claro.
El código es éste:

INHERITS Connection

PUBLIC PROCEDURE conectar()
    TRY ME.Close
    TRY ME.Open
    IF ERROR THEN
      Message.Error("Imposible conectar a la base de datos. Error: " & Error.Text & "\n SIRIGAMI finalizará ahora.")
      QUIT
    END IF
END

PUBLIC FUNCTION consulta(OPTIONAL sql AS String, OPTIONAL res AS Result, OPTIONAL modo AS String, OPTIONAL tabla AS String, OPTIONAL campoClave AS String, OPTIONAL clave AS String) AS Result
 
  DIM r AS Result
  DIM cad AS String
  
  IF NOT modo THEN
    modo = "C"   'C=Consulta; E=Edicion; B=Borrado   C es el modo por defecto
  ENDIF
  IF res THEN
      r = res
  ENDIF

  SELECT CASE modo
    CASE "C"
        IF NOT sql THEN
            Message.Error("condatos.consulta: Falta consulta a efectuar")
            RETURN r
        ENDIF
        TRY r = ME.Exec(sql)
            IF ERROR THEN
                ME.conectar
                TRY r = ME.Exec(sql) ' a la segunda va la vencida
                IF ERROR THEN
                    Message.Error("Se produjo el siguiente error:\n" & Error.Text)
                    RETURN r
                ENDIF
            ENDIF
    CASE "E" 'Edición de registro
        IF NOT campoClave OR NOT tabla THEN
            Message.Error("condatos.consulta: Faltan datos para el modo edición")
            RETURN r
        ENDIF
        cad = campoClave & " = &1"
        TRY r = ME.Edit(tabla, cad, clave)
        
        IF ERROR THEN
            ME.conectar
            TRY r = ME.Edit(tabla, cad, clave) ' a la segunda va la vencida
            IF ERROR THEN
                    Message.Error("Se produjo el siguiente error:\n" & Error.Text)
                    RETURN r
            ENDIF
        ENDIF
        IF r.Count = 0 THEN  'si el registro no existe lo creamos
            TRY r = ME.Create(tabla)
            IF ERROR THEN
                Message.Error("Se produjo el siguiente error:\n" & Error.Text)
                RETURN r
             ENDIF
              r[campoClave] = clave 'asignamos la clave pasada al campo clave
        ENDIF    
    CASE "B"  'Borrado
        TRY ME.delete(tabla, campoclave, clave)
        IF ERROR THEN    
            ME.conectar
            TRY ME.delete(tabla, campoclave, clave) ' a la segunda va la vencida
            IF ERROR THEN
                Message.Error("Se produjo el siguiente error:\n" & Error.Text)
                RETURN r
             ENDIF
        ENDIF    
    END SELECT  
    
RETURN r
END
 


El método conectar no se utiliza desde fuera (aunque se puede). Es lo mismo que el método open, pero con un reintento para asegurarse. Es utilizado
por el método consulta, que te ejecuta la sentencia sql o te modifica los datos (Añadir, borrar o modificar) devolviendo un objeto Result.
El truco es el invento del TBO se lanza la consulta, si falla es que se ha cortado por time-out o por otras causas y se reintenta la apertura de la conexión y se vuelve a lanzar la consulta. Si vuelve a fallar es que ha pasado algo más raro y se genera el eror (de hecho se aborta a lo bestia el prorama).
El código es un poco chapuza porque funciona y no me he molestado en hacerlo bonito ni elegante. Si tú lo adecentas, please, súbelo al foro.
La ventaja de utilizar una clase es que puedes tener sin problemas más de una conexión abierta a la misma o a distintas bases de datos simultáneamente.
El ejemplo de uso sería:
       DIM condatos as NEW conexion
       DIM res as Result
       condatos.Type = "mysql"
       condatos.Host = mihost
       condatos.Login = "miusuario"
       condatos.Password = "mipassword"
       condatos.Name = "mibase"
       res=condatos.consulta("Select * from mitabla")
 


Los puretas de la POO dirán que no está bien eso de usar parámetros en lugar de propiedades y demás, pero es que soy así de primitivo y no me aclaro mucho con la POO.

Suerte
 




===================
No podemos regresar
 
última edición por shordi el Viernes, 01 Octobre 2010, 19:27; editado 1 vez 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Problema Con El Manejo De Campos Mediumtex... jsoto61 Bases de Datos 25 Viernes, 27 Noviembre 2009, 10:31 Ver último mensaje
langostino
No hay nuevos mensajes Problema Con Conexion Mysql Despues De Com... ezequielnava General 3 Jueves, 09 Junio 2011, 16:37 Ver último mensaje
jose2190
No hay nuevos mensajes Controlar Timeout Mysql pctotalsantafe Bases de Datos 4 Lunes, 24 Octobre 2011, 20:29 Ver último mensaje
pctotalsantafe
No hay nuevos mensajes Problema Con Indice De Busqueda Mysql desoljor Aplicaciones/Fragmentos de Código 4 Lunes, 11 Enero 2016, 20:16 Ver último mensaje
desoljor
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron