Como evitar que la conexión MYSQL se cierre por inactividad

3,917 views
Skip to first unread message

Diacrisa

unread,
Jun 5, 2017, 3:19:39 PM6/5/17
to Comunidad de Visual Foxpro en Español
Hola trabajo con Visual Foxpro 9 y mysql me funciona bien todo pero las conexiones se cierran con la inactividad como hago para evitar eso o para prolongar esta conexión. 

Qsoft

unread,
Jun 6, 2017, 3:48:00 AM6/6/17
to publice...@googlegroups.com
1) verifica el setting del Mysql a quanto tiempo tiene el cierre automatico por inactividad.y aumentalo si es necesario

2) prueba a programar in modo de no tener siempre abierta la conexion sino solo cuando la uses. una vez terminada la actividad con il DB cierra la conexion (recomiendo eto)

Saludos

Enrique Vasquez B.

Alberto Mancuso

unread,
Jun 7, 2017, 6:02:56 PM6/7/17
to Comunidad de Visual Foxpro en Español
yo te recomiendo crea una funcion conecta() y desconecta()
y llamala cada ves que deseas trabajar con las tablas , yo lo uso asi y me aseguro la coneccion 
algo asi :
*-------------------------------
PROCEDURE chequea
*bdConn = SQLSTRINGCONNECT(lcCnxStr) && ESTABLECER LA CONEXION

m.ResCon = SQLEXEC(bdConn,"select now()","csrNow") 
IF m.Rescon = -1 
        * intento una reconeccion
        conecta()
        ELSE 
*        WAIT WINDOW " hay coneccion .... " nowait
ENDIF 
return
*-----------------------------
PROCEDURE conecta
lcServidor   = "localhost"
* ip hamachi sino poner localhost
lcBaseDatos  = "veter"

lcUsuarioSQL = "root"
lcPass       = "********"

*lcCnxStr = "Driver={MySQL ODBC 3.51 Driver};Port=3306;Server=" + lcServidor + ";Database=" + ALLTRIM(lcBaseDatos) + ";Uid=" + lcUsuarioSQL + ";Pwd=" + lcPass + ";OPTION=131329;"
lcCnxStr = "Driver={MySQL ODBC 3.51 Driver};Port=3306;Server=" + lcServidor + ";Database=" + ALLTRIM(lcBaseDatos) + ";Uid=" + lcUsuarioSQL + ";Pwd=" + lcPass + ";OPTION=131329;"
   
SQLSETPROP(0,"DispLogin",3)
bdConn = SQLSTRINGCONNECT(lcCnxStr) && ESTABLECER LA CONEXION

IF bdConn < 1
   =AERROR(laError)
   lnError = TRANSFORM(laError(1))
   lcError = laError(2)
   MESSAGEBOX("Imposible Realizar la Conexión con el Servidor de Datos." + CHR(13) + CHR(13) + ;
    "Número de Error: " + lnError + CHR(13) + ;
    ALLTRIM(lcError),048,"Error == Conexión Base de Datos")
   RETURN .F. 
ENDIF
=SQLSETPROP(bdConn, 'PacketSize', 5000)
*THISFORM.label6.Caption = "Conectado con: " + lcServidor + "       Usuario: " + lcServidor + "@" + lcUsuarioSQL
*MESSAGEBOX("Se Realizo la Conexion con Exito.",48+0+0,"Conexión Base de Datos")
WAIT WINDOW " Conexion Realizada Ok !!! " NOWAIT 
RETURN

de esta forma no deberias tener problemas de conección ...
saludos

mapner

unread,
Jun 7, 2017, 6:15:07 PM6/7/17
to Comunidad de Visual Foxpro en Español
El tema de conectar/desconectar tiene cierta penalización en el tiempo que imponen las aperturas de conexiones. O sea, hay que administrarlo bien porque puede enlentecer la perfomance de los sistemas ... y no hacer cosas raras tales como:

DO WHILE (condición...)

  * ABRIR CONEXION
  nCon = SQLSTINGCONNECT(...)

  * ejecuto comando/s SQL
  nRet = SQLEXEC(nCon,....) 

  * Cerrar conexión...
  SQLDISCONNECT(nCon)

ENDDO

* Saludos

Germán Fabricio Valdez

unread,
Jun 7, 2017, 6:37:59 PM6/7/17
to Comunidad de Visual Foxpro en Español
agrega a tu proyecto un objeto timer y cada 60 segundos que envie un comando o una consulta al servidor
esto mantendra activa la conexion

Leonardo Martinez

unread,
Jun 7, 2017, 6:40:57 PM6/7/17
to Comunidad de Visual Foxpro en Español
Hola Diacrisa..

Mi pregunta es.. : Para que la Necesita Abierta ?

La Mejor forma de optimizar es buscar y/o llevar informaciones 
y cerrar el canal de Comunicación... Nunca se deja abierto.. 

ZeRoberto

unread,
Jun 7, 2017, 8:34:40 PM6/7/17
to publicesvfoxpro
El problema de desconectarse es que cuando trabajas con hosting el proceso de reconexion es un poco lento

Saludos

ZeRoberto

unread,
Jun 7, 2017, 8:39:08 PM6/7/17
to publicesvfoxpro
Haber revisa este codigo y trata de adaptarlo a tu estilo, yo que trabajo con hosting nunca me ha fallado, si se desconecta se vuelve a conectar.

Saludos

Procedure SQLExec
Parameters tcSQLCommand, tcSQLCursorName
Local lnCount

    tcSQLCommand = Iif(Vartype(tcSQLCommand) == "C", tcSQLCommand, "")
    tcSQLCursorName = Iif(Vartype(tcSQLCursorName) == "C", tcSQLCursorName, "")
    
    If Pcount() = 0
       Return -1
    EndIf
    
    lnCount = 1
    Do While .T.
       This.SQLCode  = -1
       This.SQLCount = 0
       This.LastExec = tcSQLCommand
       If Pcount() = 1
          This.SQLCode = SQLExec(goSQL.SQLHandle, tcSQLCommand)
        Else
          Use In Select(tcSQLCursorName)
          CursorSetProp("MapBinary", .T., 0)
          This.SQLCode  = SQLExec(goSQL.SQLHandle, tcSQLCommand, tcSQLCursorName, laCount)
          This.SQLCount = laCount[2]
       EndIf
       If This.SQLCode < 0
          This.SQLGetLastError()
          If This.eCode = 2006
             If !goSQL.SQLReConnect()
                goApp.MessageBox("No se pudo establecer conexion con el servidor!!", MB_STOP)
                lnCount = lnCount + 1
              Else
                Loop
             EndIf
          EndIf
          If lnCount > 3
             Exit
          EndIf
       EndIf
       Exit
    EndDo
Return (This.SQLCode)

Procedure SQLGetLastError
Local Array laError[1]
    lnError = AError(laError)
    If lnError > 0
       Do Case
          Case laError[1] = 1526
               This.eMessage = Nvl(laError[3], "")
               This.eCode    = Nvl(laError[5], 2006)
          Case laError[1] = 1427 OR laError[1] = 1429
               This.eMessage = Nvl(laError[3], "")
               This.eCode    = Nvl(laError[7], 0)
          Otherwise
               This.eMessage = Nvl(laError[3], "")
               This.eCode    = Nvl(laError[5], 2006)
       EndCase
    EndIf
Return

HernanCano

unread,
Jun 8, 2017, 1:25:49 AM6/8/17
to Comunidad de Visual Foxpro en Español
Hola, ZeRoberto.
Cuéntame: ¿Qué es goSQL.SQLReConnect()?
Gracias por compartir.

ZeRoberto

unread,
Jun 8, 2017, 1:31:40 AM6/8/17
to publicesvfoxpro
Hola Hernan

Procedure SQLReConnect
Local lnAnswer, llResult, lnCount
    lnCount = 1
    Do While Not This.SQLOpen()
       lnAnswer = goApp.MessageBox("Reintentando conectar con el servidor en " + Transform(lnCount) + "s ...", MB_EXCLAMATION_RETRYCANCEL, "SQL Conexion", 6000)
       lnCount = lnCount + 1
       If lnCount > 10 OR  lnAnswer = IDCANCEL
          Exit
       EndIf
    EndDo
Return (This.SQLHandle > 0)

Procedure SQLOpen()
Local lcString
    This.SQLHandle = SQLStringConnect(lcString)
Return (This.SQLHandle > 0)

HernanCano

unread,
Jun 8, 2017, 9:13:48 AM6/8/17
to Comunidad de Visual Foxpro en Español
Gracias, ZeRoberto.

Muy bueno tu escenario.

Seguimos en contacto.

Antonio Meza

unread,
Jun 8, 2017, 12:05:00 PM6/8/17
to Comunidad de Visual Foxpro en Español
Como dijo un Ex-presidente de México "Gane Haiga sido como haiga sido." jajaja

Entonces a que viene ese comentario, que la conexión al servidor de base de datos sea cual sea (FireBird, Mysql, etc), se debe conectar y desconectar, es decir si necesito consultar algo, me conecto, obtengo los datos y me desconecto, si necesito obtener y hacer varias cosas, pues me conecto, realizo todo lo que tenga que hacer y me desconecto.

Es como un coche, si voy a estar en un lugar por mas de 15 segundo es mejor apagar el auto, pues tenerlo prendido de nada sirve mas que gastar combustible y que la vida útil del motor sea menor, si encenderlo me toma unos 3 o 5 segundos, es lo mismo con la conexión y desconexion.

saludos
Antonio Meza

Marcos Godoy

unread,
Jun 8, 2017, 12:35:07 PM6/8/17
to publice...@googlegroups.com
Todo es válido, se me ocurren un par de notas ...
si la red es una red local y es muy estable, si configuramos nuestro mysql en un bruto server 32 gb o mas  y  1 segundo representa
mucho para nuestros procesos, recomiendo conexiones persistentes, hay procesos comerciales y de produccion que  requieren millones de querys en un solo click...., 

Si la conexion es a traves de internet ...., bueno es valido desconectar y conectar, pero como dice el señor Mapner

necesitamos programar distinto segun el caso..


si vamos hacer un proceso (scan,do while,...) ciclico
conviene abrir antes del ciclo 
y cerrar luego de el......

cada escenario es distinto por eso a veces, las clases de acceso standard, se quedan cortas al momento de
ser performantes....., y hay que extenderlas para cada caso...., aunque no lo crean todavía existen muchos procesos
por lotes o batch... que requieren distintas consideraciones..


Saludos...

Antonio Meza

unread,
Jun 8, 2017, 1:16:35 PM6/8/17
to Comunidad de Visual Foxpro en Español
Y que tiene que ver un proceso de millones de querys en un solo click con usar conexión y desconexcion? simplemente me conecto, realizo los millones de querey y me desconecto, no le veo ningún problema!! salvo que pienses que por cada query tienes que conectarte y desconectarte, entonces estas aplicando mal el proceso de conexión y desconexión.

Cada conexión que se hace al servidor consume recursos de este, supongamos que Juan entro al sistema y este se conecto al servidor, posiblemente reviso una factura y dejo la pantalla y se fue de la oficina, regreso hasta el otro día, crees que ese proceso de conexión permanente beneficio algo? estar consumiendo recursos del servidor pues el servidor no sabe que Juan ya no esta haciendo nada, el sabe que tiene ese proceso en el y lo tiene que mantener y validar contra las transacciones que vaya teniendo.

Un ejemplo mas practico, contrata un servicio de Google o Azure donde te cobran por uso del servidor y entonces ve cuanto te va a salir mantener un sistema que siempre este conectado contra un sistema que se conecte y desconecte solo cuando necesita realizar algo.

Es un tema tan amplio para explicar pero tan sencillo de entender, lo mejor es y sera conectar y desconectar, sea el tipo de red que sea, son temas tan trillados en internet que lamentablemente por desconocimiento general se usa lo que se cree mas no lo que realmente es, por eso muchos dirán "aiga sido como aiga sido" a mi me funciona conexión permanente y punto jajajajaja es como las variables Publicas, en buenas practicas no se usan, pero todo mundo las usas entonces que es mejor? el que estudia buenas practicas (como yo) te dirá que no usarlas es lo mejor, el que te diga aiga sido como aiga sido me funcionan las variables publicas y el 90% de los programadores las usan así que es mejor usarlas, como digo eres del montón o quieres mejorar!!!

saludos
Antonio Meza

Hector Colman

unread,
Jun 8, 2017, 9:25:38 PM6/8/17
to Comunidad de Visual Foxpro en Español
A ver... yo trabajo con la conexión permanente hace rato y si funciona bien (yo solucione el problema de inactividad con un timer de 5000 intervalo modificando un campo de una tabla ) ahora que estoy en PHP con MariaDB  las conexiones realizo cada vez que necesito y también funciona de maravilla, también utilizo mucho las variables publicas y en PHP la SuperGlobal.... depende mucho de cada uno

Antonio Meza

unread,
Jun 8, 2017, 11:23:21 PM6/8/17
to Comunidad de Visual Foxpro en Español
O sea que tu programas Aiga sido como Aiga sido la cosa es que funcione jejejeje !!!! es una broma !!!

saludos
Antionio Meza

ZeRoberto

unread,
Jun 9, 2017, 12:41:11 AM6/9/17
to publicesvfoxpro
Lo que dice Antonio Meza esta bien es una buena aportación, pero a veces cuando uno esta en la cancha y te dicen que el proceso esta lento uno tiene que recurrir cosas extra naturales y quizás nuestra falta de conocimientos nos hacen tomar medidas radicales, en otras palabras a veces hay que extirparle el pene para ponerle una vagina. pero lo que dice Antonio Meza esta bien las cosas se deben hacer así, nosotros venimos de una época donde las variables se definían con una v por ejemplo querías poner una variable de empresa entonces ponías vEmpresa, yo creo que debemos de poquito a poco ir cambiando de mentalidad, y que mejor que Antonio Meza que nos enseñe estas técnica y en lo posible ir cambiando nuestro cerebro, es la única forma en podremos migrar a otras herramientas, debemos escuchar y en gran medida ir cambiando nuestro modo de programar, la ventaja de este foro es que tenemos grandes programadores, como Luis Maria Guayan,Victor Espina, Fernando D Bozo y muchos mas y que ninguno de los que quizás no nombre se sienta ofendido por que cada uno de ustedes es muy valioso para la comunidad, hay que ser todo oído y aprender de los maestros.

Así que no nos hagamos problemas y escuchemos, y de lo que escuchemos tomemos lo que nos es importante y sobre todo de lo que nos va a ser util.

Y Saludos que viva por siempre Visual Foxpro.......

Roberto Reátegui Kanashiro

Qsoft

unread,
Jun 9, 2017, 3:25:14 AM6/9/17
to publice...@googlegroups.com
Buenas,

yo soy de la linea de Conectar y desconectar. No veo diferencia alguna en que el sistema pase datos a traves de una red local o a traves de internet. De hecho muchos de los programas que tengo funcionan con servidores virtuales a traves de internet e no he visto diferencia de performance tal de decir es mas lento o no.

Es solo cuestion de estructurar bien los procesos, en modo de optimizar la conexion. Quizas este equivocado...

Saludos

Enrique Vasquez B.

Alberto Mancuso

unread,
Jun 10, 2017, 12:26:20 PM6/10/17
to publice...@googlegroups.com
Mi opinión ...
Yo uso conección permanente pero ahora agregué un función de chequeo que si no hay conección me reconectar y listo 
Son distintos puntos de vistas pero todas sirven es bueno ver cómo trabajan los demás colegas 
Todo sirve saludos 

Antonio Meza

unread,
Jun 10, 2017, 12:53:19 PM6/10/17
to Comunidad de Visual Foxpro en Español
"Aiga sido como Aiga sido" así gano un presidente en mexico las elecciones!! fue lo correcto ? NO, pero le funciono jajajajaj

Que a la mayoría le funciona usar conexión permanente no quiere decir que sea lo correcto. Por ejemplo clavar un clavo con la 
mano a muchos le puede funcionar y no porque les funcione es lo correcto o si? no se si se entiende el punto.

En mi caso cuando empece a programar pues aprendí de otros y usaba variables publicas por todos lados pues era lo mas fácil y sencillo y era lo que la mayoría usaba, era del montón jajajaj también use conexión permanente y desde luego me funcionaba, hasta que empece a leer sobre "Buenas Practicas" para programar, para diseño de base de datos, interfaces, etc, etc. y dije ya no quiero ser del montón que dice que así "funciona y punto" y empece a estudiar mas a fondo y por eso se que mucho de lo que hay en internet es solo puntos de vista y experiencias pero muy diferente a la realidad de como hacer bien las cosas.

saludos
Antonio Meza

Edwin Duran

unread,
Jun 11, 2017, 11:30:21 AM6/11/17
to Comunidad de Visual Foxpro en Español

Antonio Meza

unread,
Jun 12, 2017, 10:53:48 AM6/12/17
to Comunidad de Visual Foxpro en Español
Buen articulo!!!

Abrir/Cerrar conexiones en los momentos apropiados

Abra las conexiones justo antes de utilizarlas y ciérrelas tan pronto como deje de necesitarlas. El modo de trabajo debe ser el siguiente: Conectar - Obtener/Guardar Datos - Desconectar.



saludos
Antonio Meza

Diana Cristina Aguilar Ramirez

unread,
Jun 16, 2017, 12:00:35 PM6/16/17
to Comunidad de Visual Foxpro en Español
Hola buenas
Tengo una aplicación de escritorio, la que abro cuando se inicia la sesión cuando se abre un formulario, el problema lo tengo cuando el formulario dura abierto un tempo x sin trabajar en el se desconecta. 
se cierra el formulario y se vuelve  abrir y funciona perfecto.
Pero es tedioso que si el usuario lo deja abierto por un momento X se desordene todo poque envia un mensaje de error y el usuario se asusta.
--
Diana C. Aguilar R.

Diana Cristina Aguilar Ramirez

unread,
Jun 16, 2017, 12:02:52 PM6/16/17
to Comunidad de Visual Foxpro en Español
Mi aplicación la usan a través de Internet.
Ella funciona perfecto mientras el usuario tiene abierto el formulario y esta trabajando.
pero deja el formulario abierto y se pierde la conexión.

Diana Cristina Aguilar Ramirez

unread,
Jun 16, 2017, 12:03:27 PM6/16/17
to Comunidad de Visual Foxpro en Español
Mi aplicación es por Internet

Antonio Meza

unread,
Jun 16, 2017, 1:36:52 PM6/16/17
to Comunidad de Visual Foxpro en Español
Sin importar si es local o por internet debes configurar que al realizar una o varias acciones se conecte y desconecte, te recomiendo FoxyDb es muy sencillo y ya trae esas opciones sin que tengas que hacer nada adicional.

saludos
Antonio Meza

Andres Naranjo Robledo

unread,
Jun 23, 2017, 2:18:26 PM6/23/17
to Comunidad de Visual Foxpro en Español
aquí hay unos libros puedes revisarlos puede ser que encuentres y saber lo que quieres, aquí abajo dejó la dirección


https://groups.google.com/forum/#!topic/publicesvfoxpro/OMHm6Xe69m4

almonts ( www.ontarioxb.es )

unread,
Jun 26, 2017, 7:40:28 AM6/26/17
to Comunidad de Visual Foxpro en Español
Buenas tardes.

Yo tengo programado una especia de ping remoto que lo ejecuto cada 15 segundos.
Asi me aseguro que la conexión está siempre viva, o en su defecto vuelve a re-conectar.


********************************************************************************************************

*// NH (es la variable del handler de conexión)

SQLSETPROP(NH,"DispWarnings",.F.)
IF SQLEXEC(NH,"SET @ZXC:=00")>0    && envio una variable al servidor
         SQLSETPROP(NH,"DispWarnings",.T.)
ELSE
         WAIT WINDOW 'Conectando BD ...' TIMEOUT 01     
FCNXNOR() && Funcion propia de conexión
ENDIF

*****************************************************************************************

Saludos
Reply all
Reply to author
Forward
0 new messages