Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-12-2012
Avatar de darkerbyte
darkerbyte darkerbyte is offline
Miembro
 
Registrado: feb 2005
Posts: 196
Poder: 20
darkerbyte Va por buen camino
Exclamation MySQL Server me cierra conexión

Hola amigo:

Tengo una aplicación que se conecta a WampServer (MySQL) con ZeosLib, desarrollada en Delphi7.

La situación es que en determinado tiempo, varia dependiendo de cada computadora, Wamp me cierra la conexión. Entones cuando el usuario intenta hacer algo con el programa le aparece un feo mensaje de error con este contenido:

"Error (xxx): MySQL Server has gone away"

Me he dado cuenta que la mayoria de las veces es porque se deja de usar el programa y la conexión al no tener actividad es cerrada por el Servidor, pero no hay un tiempo especifico, algunas veces 5 minutos, a veces 10 o 15, nunca es igual en cada maquina. Sin embargo también me ha pasado que en pleno uso se cierra la conexión.

Lo que hice fue poner un botón en el programa que ejecuta esta instrucción:

DM.ZConnection.Reconnect; //Método Reconectar del objeto TConnection de ZeosLib

Con esto Zeos se vuelve a conectar al servidor y el programa vuelve a funcionar. Pero como se imaginan es una lata en primer lugar que aparezca el mensaje de error y estar dándole en "reconectar" cada cierto tiempo, cuando ocurre el error.

Como pueden imaginarse, poner un bloque Try para cada consulta que hace el programa es improductivo, sería como ir al peluquero y pedirle que te corte pelo por pelo.

Estoy pensando poner un Timer que refresque la conexión cada 5 minutos por ejemplo, pero me temo que eleve el uso de el procesador, el uso de la red y el uso del servidor. Además esto no solucionará la situación de que me cierre la conexión cuando esta en pleno uso.

Gracias por tu invaluable consejo, tal vez pasaste por una situación similar, agradecería cualquier ayuda posible
Responder Con Cita
  #2  
Antiguo 11-12-2012
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Hola darkerbyte

Mira en la documentación de MySQL tratan muy bien el tema y presentan algunas soluciones.

Cita:
Usted está utilizando un cliente windows y el servidor ha cortado la conexión (probablemente porque wait_timeout ha expirado) antes de que el comando fuese ejecutado.

El problema en windows es que en algunos casos MySQL no obtiene un error desde el SO cuando escribe a la conexión TCP/IP desde el servidor, sino que obtiene el error cuando intenta leer la respuesta desde la conexión.

En este caso, aunque el flag reconnect en la estructura MYSQL sea igual a 1, MySQL no reconecta y vuelve a ejecutar la sentencia, ya que no sabe si el servidor recibió la sentencia original o no.

La solución a esto es o hacer un mysql_ping en la conexión si ha pasado mucho tiempo desde la última sentencia (esto es lo que MyODBC hace) o establecer un wait_timeout en el servidor mysqld tan alto que en la práctica, nunca llegue a sobrepasarse.
http://dev.mysql.com/doc/refman/5.0/es/gone-away.html
Otra solución podrías ser que agregaras un manejador global de excepciones y al capturar esta excepción en particular reintentaras la conexión.

Por lo general trato de utilizar una función para abrir o ejecutar todas las consultas del app. así no tengo que cortar pelo por pelo cuando voy a manejar estas excepciones especificas.

Es decir... en lugar de
Código Delphi [-]
MyQuery.Open
uso
Código Delphi [-]
OpenQuery(MyQuery, 'Select * from tabla where id = :id', [idvar]);
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #3  
Antiguo 12-12-2012
Avatar de darkerbyte
darkerbyte darkerbyte is offline
Miembro
 
Registrado: feb 2005
Posts: 196
Poder: 20
darkerbyte Va por buen camino
Globalizar excepciones?

Hola amigo [movorack]

Creo que la solucion va por ahi, con el manejador global de excepciones. ¿Me podrías explicar un poco mas de cómo lo haces?
De hecho yo tengo la duda si en componente Zconnection no tendrá alguna opción para manejar las excepciones de este tipo. Sería mucho mas simple por que al final de cuentas todas las consultas tienen que pasar por este componente.

¿El manejador de excepciones tambien se puede implementar para las ZTables?

Gracias de antemano
Responder Con Cita
  #4  
Antiguo 12-12-2012
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Ok... me cogiste de buenas pulgas y pues...

Antes que leas el código recuerda:

Buscar siempre en google.
Aquí una entrada en Delphi FAQ's
temas relacionados en About.com

Ahora sí... una aproximación a lo que te sugerí. La implementación depende de tu programa.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBTables;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
    function OpenDataset(DataSet : TDataSet; StrSQL : string; Parameters : array of Variant) : Boolean;
  public
    { Public declarations }
    //Mi propia función de manejo de excepciones
    procedure MyOnException(Sender: TObject; E : Exception);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyOnException(Sender: TObject; E: Exception);
begin
  {Aquí puedo manejar cualquier cosa antes de mostrare el mensaje de error
   Ej: Escribir en un log, Enviar alguna notificación}

  //No se debe volver a hacer raise de la excepción ya que
  //Esto generaría un bucle que llevaría a error
  Application.ShowException(E);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  //Al crear el formulario Establezco mi función
  //como manejador de excepciones global
  Application.OnException := MyOnException;
end;

procedure TForm1.Button1Click(Sender: TObject);
  var
    lQry : TQuery;
begin
  lQry := TQuery.Create(Self);
  try
    try
      if lQry.Active then
        lQry.Close;
      lQry.Open;
    except
      on e : EDatabaseError do
      begin
        if Pos('NO SQL', UpperCase(E.Message)) > 0 then
          raise Exception.Create('No ha establecido la cadena de consulta.')
        else
          raise Exception.Create('Ha ocurrido un error en el acceso a datos. Error: '+e.Message);
      end;
      on e : exception do
      begin
        raise Exception.Create('Ha ocurrido un error general al ejecutar la consulta. Error: '+e.Message);
      end;
    end;
  finally
    lQry.Free;
  end;
end;

function TForm1.OpenDataset(DataSet: TDataSet; StrSQL: string;
  Parameters: array of Variant): Boolean;
  var
    i : Integer;
begin
  if DataSet.Active then
    DataSet.Close;

  if DataSet is TQuery then
  begin
    TQuery(DataSet).SQL.Text := StrSQL;
    for i := 0 to Length(Parameters) - 1 do
    begin
      TQuery(DataSet).Params[i].Value := Parameters[i];
    end;
  end;

  try
    DataSet.Open;
  except
    on e : Exception do
    begin
      {Aquí darle el manejo que necesito para tratar de solucionar el error}
      raise;
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
  var
    lQry : TQuery;
begin
  lQry := TQuery.Create(Self);
  try
    OpenDataset(lQry, 'select * from tabla where id = :id', [123456]);
  finally
    lQry.Free;
  end;
end;

end.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Conexión a SQL server zvf Conexión con bases de datos 7 19-12-2007 16:41:30
Conexión MySQL 4.1 Server MaMu MySQL 1 26-08-2007 14:04:56
Conexion con Ms Sql server mrh_peru Conexión con bases de datos 4 19-10-2006 01:48:27
conexion a sql server nnl MS SQL Server 6 25-09-2006 21:50:04
Conexion con mysql server Cosgaya MySQL 2 27-07-2006 17:48:18


La franja horaria es GMT +2. Ahora son las 11:32:59.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi