Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Lentitud con ClientDataSet.XMLData en Servicio Datasnap (https://www.clubdelphi.com/foros/showthread.php?t=82209)

code88 08-02-2013 15:10:42

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;

Casimiro Notevi 08-02-2013 15:54:50

¿Puede ser el ancho de banda que tengas, algo escaso?

code88 08-02-2013 16:21:45

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.

Al González 08-02-2013 17:46:35

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.

code88 08-02-2013 18:43:07

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.


La franja horaria es GMT +2. Ahora son las 06:17:37.

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