Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos


Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-12-2015
vicens22 vicens22 is offline
Miembro
NULL
 
Registrado: dic 2010
Posts: 61
Poder: 14
vicens22 Va por buen camino
Estabilidad aplicación Datasnap Android

Buenos días,

Estoy intentando avanzar en el desarrollo de una aplicación para smartphones (Android/IOS).
La aplicación conecta, utilizado una aplicación servidor Datasnap, con una base MS-SQL y también accede a ficheros de fotografías utilizando el componente http de Indy.
La aplicación recupera datos de clientes y productos mediante diversas consultas.
A nivel de operatividad y funcionalidad estoy consiguiendo lo que buscaba, pero no así en cuanto a velocidad/estabilidad de la aplicación, ya que al probarla en diversas circunstancias de conexión a la red me encuentro con los siguientes problemas:

A) Lentitud al recuperar datos que con frecuencia acaba en un mensaje de la aplicación de que no responde (obligando a cerrarla).
B) Errores de "Socket error 104 y 110 - reset by peer"

Estoy utilizando en las pruebas Delphi Seattle 10.

Las pruebas las he realizado conectando con la base mediante Wifi y 4G y utilizando un terminal Android de gama alta (One Plus One). Los errores se suceden con más frecuencia al conectar por 4G que por Wifi, pero en ninguno de los dos casos consigo la estabilidad deseada.

Supongo que estoy haciendo algo mal al recuperar datos o en la configuración de la aplicación servidor Datasnap, pero ahora mismo ya no sé que cambiar.
Tampoco quiero continuar con el desarrollo, mientras no consiga un mínimo de estabilidad con lo que llevo hecho hasta ahora.

Hay otras opciones más estables para conectar en mi caso con MS-SQL que Datasnap o realmente debo estar haciendo algo mal ??

Gracias por cualquier ayuda o sugerencia.

Un saludo
Responder Con Cita
  #2  
Antiguo 24-12-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Yo mando tablas enteras de varios miles de registros usando wifi o 3g/4g y no tengo problemas
Fotos ya es otro tema.. obviamente una foto de 5mb va a tardar mas

Como no nos digas como esta configurado el servidor y como envias/recibis los datos no sabemos si el problema de eficiencia esta en tu codigo o en datasnap
Responder Con Cita
  #3  
Antiguo 24-12-2015
vicens22 vicens22 is offline
Miembro
NULL
 
Registrado: dic 2010
Posts: 61
Poder: 14
vicens22 Va por buen camino
Gracias Agustín, me tranquiliza tu comentario ya que llevo bastante tiempo invertido en el proyecto y espero poder aprovecharlo.

Te intento a continuación explicar ambos aspectos: el servidor Datasnap y el cliente.
Para la creación de la aplicación Datasnap Server me basé en el código de ejemplo descargado de la siguiente página:

https://jachguate.wordpress.com/2014...2014/#more-693

El enlace de descarga del ejemplo es:

http://http://goo.gl/brGgaH

En el Servidor Datasnap utilizo un objeto TAdoConnection para la conexión a MSSQL y varios TDataSetProvider y TADOQuery (uno para cada tabla o vista que necesito consultar).

El ejecutable Datasnap Server lo subí al servidor donde se encuentra el servidor MSSQL y está siempre activo. (El puerto utilizado es el 211).

En el cliente hay un ClientModule que contiene:

A) Un objeto TSQLConnection que conecta con el servidor Datasnap.
B) Un TDSProviderConnection que conectado con el objeto TSQLConnection permite a varios TClientDataSet recuperar los datos mediante Querys.

En los formularios de la aplicación cliente, utilizo los TCLientDataSet para recuperar los datos, por ejemplo de la siguiente forma:

Código Delphi [-]
procedure TForm8.SpeedButton1Click(Sender: TObject);
var cStr: string;
begin
 with ClientModule1 do
  begin

    cdsClientes.Close;

    cStr:= 'select *  from '+ form1.cDataBaseName +'.dbo.Vista_Clientes order by cApeCli desc';

    cdsClientes.CommandText := cStr;
    cdsClientes.Open;

  end;

   Form9.Show;
end;


Como te he explicado aunque la operativa funciona, es completamente inestable, al realizar varias consultas seguidas siempre acaba dando algunos de los errores mencionados o bloqueándose la aplicación.

En cuanto a las fotografías entiendo que tampoco debería ser problema su tamaño, ya que todas están reducidas a un tamaño que oscila entre 40 y 120 Kb.

Espero que la información pueda ayudarte a ver donde puede encontrarse el problema.
Si necesitas que te envíe el código de la aplicación Servidor o cliente tan solo dímelo.

Muchas gracias de nuevo.
Saludos

Última edición por vicens22 fecha: 24-12-2015 a las 18:29:39.
Responder Con Cita
  #4  
Antiguo 24-12-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Yo tengo configurado Datasnap de la siguiente manera:

En el server, tambien usamos MSSQL. No uses ADO; es lento, es inestable, nunca me gusto

Ya que tenes 10 Seattle, opta por FireDAC.

El sevidor exopne un par de metodos para obtener datos, y uno o dos para insertar/actualizar. Es muy sencillo

Todo gira en torno a la clase "TFDJSONDataSets": es decir, los clientes mandan "TFDJSONDataSets", y el server devuelve "TFDJSONDataSets"; es basicamente un DataSet codificado en json y luego en base64 para que sea lo mas rapido posible de transportar.

En el uses necesitas agregar:

Código Delphi [-]
  Data.FireDACJSONReflect,
  FireDAC.Stan.StorageJSON,

Los metodos "Get" tienen la forma:

Código Delphi [-]
function TServerMethods1.GetClientes: TFDJSONDataSets;
begin
  // refresh query
  qClientes.Active := False;
  Result := TFDJSONDataSets.Create;
  TFDJSONDataSetsWriter.ListAdd(Result, qClientes);
end;

Los metodos "Insert" tienen mas "truco". Lo que yo hago es, recibir la instancia de TFDJsonDataSets y cargarlo en un FDMemTable; de alli, la recorro y se trata de un "DataSet normal". No hay que asustarse por el "alarmante" numero de operaciones; en realidad es todo bastante rapido

Código Delphi [-]
function TServerMethods1.InsertPedidos(Pedidos: TFDJSONDataSets): Boolean;
begin
  // cabeceras
  mtPedidos.AppendData(TFDJSONDataSetsReader.GetListValue(Pedidos, 0));
  // detalles
  mtDetalles.AppendData(TFDJSONDataSetsReader.GetListValue(Pedidos, 1));

  mtPedidos.First;
  while not mtPedidos.Eof do
  begin
   { blabla }
   mtPedidos.Next;
  end;
end;

Del lado del cliente:

Código Delphi [-]
var
  MemTab: TFDMemTable;
  JsonData: TFDJSONDataSets;
begin
  MemTab := TFDMemTable.Create(NIL);
  // pedir  clientes al server
  JsonData := Client.Methods.GetClientes;

  // volcar en FDMemTable
  MemTab.AppendData(TFDJSONDataSetsReader.GetListValue(JsonData, 0));
  MemTab.Open;
end;

Espero te sirva
Responder Con Cita
  #5  
Antiguo 24-12-2015
vicens22 vicens22 is offline
Miembro
NULL
 
Registrado: dic 2010
Posts: 61
Poder: 14
vicens22 Va por buen camino
Muchas gracias Agustín por tu rápida respuesta y extensa explicación.

Voy a intentar aplicar todo lo que comentas a ver si finalmente consigo la estabilidad necesaria para poder continuar con el proyecto.

Saludos
Responder Con Cita
  #6  
Antiguo 16-01-2016
Avatar de wflorest
wflorest wflorest is offline
Miembro
 
Registrado: jun 2007
Ubicación: Perú
Posts: 10
Poder: 0
wflorest Va por buen camino
Hola,

Ante todo te agradezco la respuesta la pregunta del compañero, yo quisiera hacerte otra pregunta.

Como manejas las validaciones de los campos, como ejemplo las ventas sean menores a... u otras que pudieramos necesitar.

En la práctica estas deben darse en el aplicativo cliente, pero de ninguna manera programarlos ahi, verdad.
Entonces como se programan estos en el servidor y como los llamamos luego en el cliente.

Te agradecería puedas ayudarme en este tema.

Saludos desde Perú.
Responder Con Cita
  #7  
Antiguo 26-01-2016
[birmain] birmain is offline
Miembro Premium
 
Registrado: feb 2005
Ubicación: Albacete - España
Posts: 49
Poder: 0
birmain Va por buen camino
Estabilidad de DataSnap

El problema que describes lo traté hace más de un año y llegué a varias conclusiones.

1ª) Hay varias formas de conectar DataSnap. Una de ellas es utilizar una conexión tcp, que es una conexión con estado. Por tanto, hay que mantener la conexión viva en el servidor, y muy a menudo se producen desconexiones y lentitud de servicio. Esto no es muy adecuado para una aplicación web, ni tan siquiera para una app nativa. Lo más adecuado es establecer conexiones sin estado, donde la identificación vaya en la cabecera de cada petición. Esto nos lleva a un servidor REST

2ª) Llegados a este punto, también se puede configurar DataSnap como servidor REST bajo el protocolo http, pero el rendimiento y la estabilidad deja mucho que desear.

3ª) Para mi, la mejor solución es recurrir a un servidor de robustez contrastada, como Apache, y resolver las conexiones a la base de datos con PHP y devolverlos en formato JSON, donde se pueden tratar perfectamente en Delphi, y devolverlos al servidor en el mismo formato. Aún mejor solución es crear un servidor con Node JS, si se domina JavaScript.

4º) Yo dejaría Delphi vara resolver la parte cliente, y poder hacer aplicaciones multiplataforma nativas. Embarcadero quiere abarcarlo todo, pero en lo referente al servidor deja mucho que desear.

Es una opinión. Un saludo.
Responder Con Cita
  #8  
Antiguo 09-09-2016
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Mira tendras que leer esto, y espero no te decepciones.
https://www.clubdelphi.com/foros/sho...632#post508632
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #9  
Antiguo 19-01-2017
clauxs88 clauxs88 is offline
Miembro
 
Registrado: feb 2013
Ubicación: Asuncion
Posts: 11
Poder: 0
clauxs88 Va por buen camino
Todo espectacular, pero a mi me daba un error tipo:
EFDException with message '[FireDAC][Stan]-716. Unknown storage format [BIN]. Hint: To register it, you can drop component [TFDStanStorageXxxLink] into your Project

Lo solucioné colocando el uses FireDAC.Stan.StorageBin en el ServerMethods y en el form del Cliente donde se usa el TFDJSONDataSetsReader.
Responder Con Cita
  #10  
Antiguo 20-01-2017
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.233
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Tal vez podrías probar un acceso directo a SQLServer utilizando UNIDAC.
No creo que sea lo recomendable (Al menos en teoría), pero UniDAC permite hacerlo.

Siempre puedes hacer una prueba con la trial a ver qué tal.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Aplicacion Delphi Android - DataSnap - Linux jo3litro Desarrollo en Delphi para Android 8 11-12-2015 03:26:43
Android conexión a DataSnap mediante 3G/4G Combat-F2D Desarrollo en Delphi para Android 2 05-10-2015 08:17:01
DataSnap - Android-IOS Ricardo2010 Desarrollo en Delphi para Android 1 26-11-2014 03:08:52
ListView only display 200 records XE5, DataSnap - Android dison Desarrollo en Delphi para Android 4 02-04-2014 21:11:21
Datasnap y cliente android - Problema al conectar vicens22 Desarrollo en Delphi para Android 8 04-12-2013 11:13:28


La franja horaria es GMT +2. Ahora son las 15:31:52.


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