Perdida de conexión a un servidor MySQL mediante ODBC y MS Access

Desde hace tiempo hice un sistema que utiliza a Microsoft Access pero el motor de base de datos esta en MySQL. Utilizando el conector ODBC el origen de los datos es transparente para Access y con eso puedo tener un sistema más eficiente al momento de realizar algunas consultas.

Todo funcionaba de maravilla, hasta que llegó el momento de unir dos sucursales mediante una VPN, coloqué el servidor en un extremo y algunos de los clientes en el otro, entonces fue cuando empecé a recibir mensajes como este:

MySQL Server has gone away (#2006)

Lo malo es que este error provocaba congelamientos en el sistema o evitaba que se guardaran los últimos cambios, cosa que definitivamente puede llevar el calificativo de no good.

Al parecer ya es un bug conocido según este reporte. Ahí mencionan que lograron evitarlo haciendo una pequeña consulta cada cierto tiempo para mantener viva la conexión.

Eso era relativamente sencillo de intentar, siempre tengo un formulario abierto en el que tengo el menú de opciones, así que ahí decidí poner el código.

Abri el formulario en modo diseño y modifique la propiedad Intervalo de cronómetro

timer

El valor esta en milisegundos así que 10000 equivale a 10 segundos, este valor se puede ir “ajustando”, más largo si no es tan frecuente el problema, hasta encontrar un valor óptimo.

Ahora generé un código en la propiedad Al cronómetro, en este punto hay varias maneras de hacerlo, básicamente lo que se requiere es hacer una pequeña consulta, así que inserté el siguiente código:

Private Sub Form_Timer()
Dim dbMidb As Database
Dim qdfConsulta As QueryDef
Dim rst As DAO.Recordset
Dim strConsulta As String
On Error GoTo Error:
'Inicializa los parametros de la consulta.
Set dbMidb = CurrentDb
Set qdfConsulta = dbMidb.CreateQueryDef("")
'Ejecuta una consulta sencilla para mantener viva la conexión.
strConsulta = "SELECT usuarios.usuario FROM usuarios;"
qdfConsulta.SQL = strConsulta
Set rst = qdfConsulta.OpenRecordset
Error:
'Terminamos el recordset
rst.Close
End Sub

Claro que la instrucción SQL expresada en la variable strConsulta puede ser diferente dependiendo del nombre de las tablas de cada proyecto, elegí la tabla de usuarios porque a lo mucho me regresa 10 registros.

consulta

Ahora solo falta comprobar que se este ejecutando la consulta. Al revisar la gráfica puedo ver un pequeño “pulso” cada cierto tiempo que me dice que efectivamente todo esta funcionando como se planeo.

grafica

Quiero suponer que el problema se debe a algún detalle en el ODBC de Windows, pero mientras sale un arreglo mejor esta consulta intermitente me esta funcionando.

5 thoughts on “Perdida de conexión a un servidor MySQL mediante ODBC y MS Access

  1. Claro que tambien podrias checar si la conexion esta abierta antes de ejecutar un query, si no esta abierta abrirla, no recuerdo si hay in isOpen o con .State = adStateOpen, ya tiene mucho que no lo uso. Si tienes un método que haga tus queries (lo tienes, verdad?) entonces solo necesitas el cambio en un lugar, i.e. en tu Public Sub doQuery() poner esa validación… si no, pues…

  2. argh, extrañamente el sitio se tragó mi segundo comentario, te decia que podrias checar el estado de la conexión antes de tus queries, si tienes un Public Sub doQuery y lo usas en toda tu app para correr los queries, es mas sencillo, solo checar si la conexion esta viva antes de correr el query, si no, abrirla. Asi no tienes que estar ejecutando queries sin sentido cada X tiempo.

¡Me encantaría saber que opinas!

%d bloggers like this: