Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
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 08-02-2013
code88 code88 is offline
Registrado
 
Registrado: Feb 2011
Posts: 5
Poder: 0
code88 Va por buen camino
Lentitud con ClientDataSet.XMLData en Servicio Datasnap

Buen día gente.
Me ha surgido un inconveniente al desarrollar una aplicación que permita sincronizar bases de datos entre una PC y un servidor, del cual se actualizará el resto de las PC.
Para transmitir los datos que necesito actualizar, almaceno una consulta en un ClientDataSet y envio el contenido de la propiedad XMLData. El problema me surge cuando lo asigno a un nuevo ClientDataSet en el Servicio DataSnap ya que los XMLData son bastante pesados (10 MB, 40 MB, etc) y la asignación llega a tardar 5 o 10 minutos. Ahora bien, si esto mismo lo hago en un servidor Datasnap VCL la asignación es instantanea.
Alguien sabe cual puede ser la causa / solución?

Les dejo el bloque de código que me da problemas:

Código Delphi [-]
//EN EL SERVICIO CLIENTE 
var
  stXMLData: string; 
  cdsNuevoDatos: TClientDataSet;  

begin 
//realizo las consultas y asigno al cds 
cdsNuevosDatos.Open; 
stXMLData := cdsNuevosDatos.XMLData; 
//mas codigo 
end; 

//EN EL DATASNAP RECIBO EL XMLData 
procedure prActualizarTabla(pstXMLData: string); 
var
  cdsNuevosDatos: TClientDataSet;
begin
//algo de codigo
cdsNuevosDatos := TClientDataSet.Create(Self);
//el string son unos 11MB y tarda mas de 5 min en la prox linea
cdsNuevosDatos.XMLData := pstXMLData; 
//mas codigo
end;
Responder Con Cita
  #2  
Antiguo 08-02-2013
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: Sep 2004
Ubicación: En algún lugar.
Posts: 28.317
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Puede ser el ancho de banda que tengas, algo escaso?
Responder Con Cita
  #3  
Antiguo 08-02-2013
code88 code88 is offline
Registrado
 
Registrado: Feb 2011
Posts: 5
Poder: 0
code88 Va por buen camino
Hola casimiro!
Todas las pruebas que hago son sobre una misma maquina, así que no tiene porque ser problema de Ancho de banda. El cliente es un servicio de windows, y el DataSnap lo tengo hecho como servicio o como aplicación VCL. Ambos servicios estan instalados en la misma PC.
Obviamente no tengo las dos versiones del DataSnap ejecutandose al mismo tiempo.
Responder Con Cita
  #4  
Antiguo 08-02-2013
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: May 2003
Posts: 5.504
Poder: 23
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola code88.

No mencionas qué versión de Delphi utilizas, ni detallas en qué consiste la alternativa que dices funciona más rápido, ni los pormenores del proyecto, la razón para hacer lo que estás haciendo, el contexto, el objetivo real detrás de ese código, etc. En fin, que sería muy bueno que compartieras a detalle de dónde viene esa necesidad, para entender mejor lo que buscas, por qué lo buscas y qué alternativas habría.

Ahora bien, considera que un XML es un documento de texto con mucha información redundante. Pero así tiene que ser para ser transportable / transferible / compatible entre diferentes sistemas. Pero aquí, por lo poco que nos dejas ver, estamos hablando de un mismo sistema.

Me llama la atención que estando en red (o en una misma PC), recurras al guardado como XML, en lugar de enviar los datos directamente al servidor. Pero, si por alguna razón (que no nos has dicho) sigue siendo necesario almacenar el contenido del ClientDataSet en un buffer intermedio (como lo es esa variable stXMLData), entonces quizá deberías considerar usar el formato binario en lugar de XML:
Cita:
Empezado por la ayuda de Delphi
SaveToStream method (TCustomClientDataSet)

Saves a client dataset’s data to a stream.

Delphi syntax:

procedure SaveToStream(Stream: TStream; Format TDataPacketFormat=dfBinary);

Description

Call SaveToStream to write a client dataset’s data to a stream.

Stream is the name of an existing stream to write to.

Format indicates what format to use when saving the data, binary (dfBinary) or XML (dfXML), or UTF8-based XML (dfXMLUTF8).

If the stream requires a buffer, use the DataSize property to determine the required size of the buffer.

...

TDataPacketFormat type

TDataPacketFormat indicates how information is encoded in a data packet or delta packet.

Unit

DBClient

Delphi syntax:

type TDataPacketFormat = (dfBinary, dfXML, dfXMLUTF8);

Description

TDataPacketFormat indicates how a provider encodes database information into data packets. The following table lists the possible values:

Value Meaning

dfBinary Information is encoded in binary format.
dfXML Information is encoded in XML, with extended characters encoded using an escape sequence.
dfXMLUTF8 Information is encoded in XML, with extended characters represented using UTF8.
Espero sirva de algo mi intervención, saludos.

Al González.
__________________
Twitter
Código
Blog
WhatsApp para consultas rápidas y asesorías profesionales: +52 1 2711260117
Responder Con Cita
  #5  
Antiguo 08-02-2013
code88 code88 is offline
Registrado
 
Registrado: Feb 2011
Posts: 5
Poder: 0
code88 Va por buen camino
Smile

Al gracias por el interes , voy a tratar de explicar lo mejor posible todo. Aclaro antes de empezar, por si notan algo medio raro, que es la primera vez que manejo cosas como ClientDataSet, DataSnap, modelo cliente servidor, transmisión de datos en red / web, etc.

Para empezar trabajo con Delphi XE3 Update 1, Firebird 2.5 y dbExpress.

La idea del proyecto es que permita sincronizar bases de datos entre sucursales de una empresa. Desde casa central se debe enviar cada X cantidad de tiempo los cambios que haya sufrido la base de datos (Insert, Update o Delete) al Datasnap que estaría en un servidor Web. A su vez, las sucursales deben bajar estos cambios cada cierto periodo de tiempo. Esto esta pensado para empresas que no tienen conexión a internet permanentemente, cuando vuelvan a conectarse preguntar al Web services por los cambios y bajarlos.

Para esto la idea es: Como Web Service un Servicio Datasnap TCP/IP. Y para los clientes (Casa central / sucursales) un servicio de windows común. Para ir desarrollando y probando la sincronización de las BD trabajo sobre mi propia PC. El proximo paso será probar el envio de datos.

Ahora bien los pasos de la sincronización es:
El cliente inicia la conexión con el DS y le solicita el listado de tablas a actualizar y fecha de última actualización. Con esta info hago las consultas en la BD del cliente y traigo los datos actualizados que cargo en un ClientDataSet por cada tabla. Luego le envio los XMLData al DS y corto la conexión entre ambios. Ahora comienzo a cargar estos XMLData a ClientDataSet dentro del DS para actualizar su Base de datos.

Antes de todo esto trate de hacer cosas mas simples como enviar el ClientDataSet o TStream con la info pero siempre me daba problemas para recuperar los datos en el DS y por lo que investigue es por la limitación de JSON para manejar tipos de datos mas complejos como por ejemplo punteros.

Todo esto me sirve, y funciona perfectamente. Ahora bien, vuelvo a lo que plantee en el primer post. Cuando trato de asignar XMLData muy grandes al cds, ese paso, puede llegar a tardar 20 minutos si el server DataSnap es un servicio. Pero si el DS lo creo como formularios entonces la asignación se produce en segundos.

Bueno creo que explique todo lo pedido, espero no haber pasado nada por alto.
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
buscar registros de un ClientDataSet a otro clientDataSet novato_erick Conexión con bases de datos 2 02-02-2013 20:48:09
Error Abriendo ClientDataSet con parametros DataSnap XE3 dison Providers 1 17-11-2012 08:02:29
Como arrancar o parara un servicio en funcion de otro servicio ?? QuarkBcn API de Windows 12 15-06-2011 14:46:11
¿Lentitud en arranque de servicio? Angel Vicente Firebird e Interbase 4 19-11-2010 07:04:01


La franja horaria es GMT +2. Ahora son las 19:29:53.


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