Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Conección a BD con mala conectividad (https://www.clubdelphi.com/foros/showthread.php?t=89430)

mjjj 19-11-2015 22:02:17

Conección a BD con mala conectividad
 
Estimado,
Tiempo atrás desarrollé una aplicación de escritorio en Delphi 2010 que se conectaba dentro de una intranet a una BD Firebird 2.5.
Todo funcionaba perfecto, hasta que se comenzaron a abrir nuevas sucursales lejanas geográficamente al servidor.

He estado investigando y una buena solución podría ser implementar Datasnap, o definitivamente desarrollar una versión web.
El tema es que en algunas sucursales funciona bien, sin embargo, existen algunos puntos donde internet es por medio de una acceso de celular, el cual es muy lento y eventualmente se corta la comunicación.

He realizado algunas pruebas con DataSnap y ocurre que cuando hay micro cortes de internet, se pierde la comunicación y finalmente el programa se termina colgando.
Pongo de ejemplo el código con el cual se cuelga mi aplicación

Código Delphi [-]
var myServer : TDSEmpresaClient;
begin
try
mistareas.close;

myServer := TDSEmpresaClient.Create(form1.SQLConnection1.DBXConnection);
myServer.mis_tareas(strtoint(Edit1.Text));
myServer.Free;

mistareas.Open;

except
try
sqlconnection1.Close;
sqlconnection1.Open;

finally
  TrayIcon1.BalloonHint := 'Problema de red.'+#13+ 'Intentando conección...';

  TrayIcon1.Animate := True;
  TrayIcon1.ShowBalloonHint;

end;
end;

donde mistareas es un TclientDataSet y mis_tareas es un procedimiento expuesto por el servidor datasnap que consulta con una TIBquery a una base de dato firebird 2.5.
El IBQuery del servidor está conectado a un TDataSetProvinder, al cual se puede acceder desde el cliente en código adjunto.
Intentando replicar el problema de los usuarios, es que desconecto el cable de red y llamo al procedimiento, observando como la aplicación de cuelga y me arroja un error... Socket Error #11001. Host not found.


Preguntas:
Cual es la forma correcta de llamar a una función/procedimiento expuesto por un servidor Datasnap, tal que si arroja algún problema lo informe al usuario y no se cuelgue??
Que tecnología me recomendaría utilizar para estos casos??

Espero me puedan guiar.
Saludos

mamcx 19-11-2015 22:19:54

Es importante aceptar que es imposible asegurar que una llamada remota se ejecutara exitosamente.

No es asunto de tecnologias, es cosa de:

1- TODA llamada remota fallara en algun momento
2- TODA llamada remota puede ser invocada en desorden, mas de 1 vez
3- Bajo el protocolo TCP, no hay llamadas "cortadas/parciales", pero eso solo aplica a 1 llamada, no a la secuencia que tengas
4- TODA llamada deberia ser idempotente

Como se combate?

1- EL minimo de datos enviar/recibir
2- Y en BATCH de ser posible (agrupar muchas)
3- Y comprimido de ser posible (o binario quizas)
4- Opcionalmente, se puede hacer reintentos por N veces al caerse llamada (que es lo que se puede hacer en este caso)
5- Siempre debe haber timeouts y responder apropiadamente


Antes de cambiar de componentes, mejor mira si puedes habilitar compresion, reducir el largo de las llamadas, mirar que CONSECUENCIAS tendria el hacer llamadas en "desorden" (si son tus metodos IDEMPOTENTES?)

mjjj 19-11-2015 22:35:52

Gracias mamcx por tu pronta respuesta, y entiendo lo que expones, sin embargo, y siguiendo con la idea de DataSnap como llamo a una función/procedimiento tal que si arroja algún problema lo informe al usuario y no se cuelgue??

Código Delphi [-]
var myServer : TDSEmpresaClient;
begin
try

if sqlconnection1.connected then
sqlconnection1.close;
sqlconnection1.open;

mistareas.close;

myServer := TDSEmpresaClient.Create(form1.SQLConnection1.DBXConnection);
myServer.mis_tareas(strtoint(Edit1.Text));
myServer.Free;

mistareas.Open;

except
try
sqlconnection1.Close;
sqlconnection1.Open;

finally
  TrayIcon1.BalloonHint := 'Problema de red.'+#13+ 'Intentando conección...';

  TrayIcon1.Animate := True;
  TrayIcon1.ShowBalloonHint;

end;
end;

claramente el código que agrego no es el ideal ya que mi aplicación sigue colgándose.
Es buena idea cada vez que necesito algún dato de la base de dato abra la conección, consulte lo necesario y finalmente cierre la conección?? o es mejor mantener la conección abierta y manejar los errores??

Ayuda con el código...
Gracias.

mjjj 20-11-2015 23:33:13

Algún maestro de Datasnap que me ayude aclarar mis dudas...

Resulta que al momento de desarrollo de una aplicación de escritorio que se conecta a un servidor datasnap por medio de internet, en desarrollo (el servidor y cliente en la misma máquina) todo va de maravilla, pero al momento de distribuir el cliente comienzan los dolores de cabeza.

En muchas oportunidades el acceso a internet es bastante malo, con sucursales lejanas al servidor, o incluso con un acceso 3G con mala señal, pero que requieren acceder a la base de dato.
Como el cliente no puedo darse cuenta de la perdida de conección al servidor, antes de cada consulta cierro y abro la conección al servidor datasnap, pero si no puedo conectarme la aplicación queda colgada... :(

Que puedo hacer?
Es la tecnología adecuada para esta situación?
Alguna idea de código quepueda utilizar para solucionar esto?

Espero me puedan ayudar, que ya no se por donde seguir...
Gracias.


La franja horaria es GMT +2. Ahora son las 09:54:53.

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