Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Conexión lenta (https://www.clubdelphi.com/foros/showthread.php?t=89392)

ELANDETA 14-11-2015 13:59:12

Conexión lenta
 
Buenas a todos,

He estado creando una aplicacion datasnap desde mi pc la coneccion a base de datos es rapida. Pero al llevarla a un servidor con windows server tarda uno 3 segundos en realizar la coneccion.

Por la naturaleza de la aplicacion el metodo empleado es Conectar a Bd -> Ejecutar Select, Insert, etc -> Desconectar de BD.

Tengo entendido que la primera vez que se conecta si dura esto tres segundo en establecer vinculo con la base de datos, pero las demas conecciones deberian ser rapida.

Si comparo con una aplicacion .Net es asi, la primera coneccion es lenta pero luego las demas conecciones son rapida.

Lo currioso es que en mi pc de desarrollo funciona correcto, este metodo es agil, en otra pc de otro desarrollador funciona correcto, pero en otros pc cada peticion tarda sus 3 segundos en conectar a base de datos. Ya hemos utilizado los componentes FireDac y Ado y el problema continua.

La Base de Datos es SQL Server y ya se instalo el SQLClient en la pc, pero continua la lentitud.

Agradeceria cualquier ayuda que me puedan brindar....

AgustinOrtu 14-11-2015 15:13:56

Si el problema es que tarda en establecerse la conexion entre el componente (ADO, FireDAC, etc) proba manteniendo viva la conexion; es decir, te llega un metodo a tu server datasnap, si no estas conectado a la DB, conectas, despues ejecutas SQL. Al finalizar, no desconectes de la DB, dejala abierta la conexion

Como tenes configurada la propiedad LifeCyle?

En desarrollo funciona ok.. conectan a una BD local?
En produccion instalaron SQL Server, montaron una BD, y el server datasnap se conecta a esa BD? Es decir, es igual a produccion o estan conectando a una BD en "otro lado"?

Saludos

newtron 15-11-2015 09:17:07

Igual me equivoco pero no creo que conectarte a la base de datos en cada vez sea lo más rápido.

¿No puedes conectarte a la base de datos al abrir el programa y desconectarte cuando lo cierras?.

Saludos

ELANDETA 15-11-2015 12:42:41

Gracias por Responder AgustinOrtu

La aplicacion debe funcionar como un RestFull, en un principio sera consumida por una aplicacion web no hecha en delphi, en un futuro tambien habra aplicaciones moviles consumiendo el servicio, se prevee un gran numero de usuarios haciendo peticiones simultanea al servicio rest, el problema de tener una coneccion siempre viva en este tipo de aplicacion es la posible concurrencia que se pueda dar, ademas, imaginate que la coneccion este ejecutando un proceso largo y luego otro usuario hace una peticion sencilla y de buena a primera nota que el sistema se puso lento, eso es lo que se intenta evitar con el metodo de abrir y cerrar coneccion tal como se hace con PHP, en .Net y en Java.

El lifeCycle esta como viene por Defecto, no lo he tocado

Veras, en producion tenemos funciona todo OK, y la base de datos es la misma a la que se conecta en producion, digo producion, pero en realidad es un servidor de prueba en donde los desarrolladores
hacemos prueba.

Lo currioso es que en el dia de ayer se monto pero en un puerto aparte y aparrentemente esta funcionando bien, tengo que esperar al proximo lunes a seguir probando, Estamos Pensando que puede ser
Alguna Plitica de seguridad que este Interfiriendo...

ELANDETA 15-11-2015 12:52:29

Gracias newtron por tu respuesta

Al tratarse de una aplicacion Rest, donde cientos y hasta miles de usuarios estaran haciendo peticiones simultaneas, el tener una unica coneccion siempre viva causara un posible bajo rendimiento de la aplicacion ademas de evitar posible concurrencia. Abrir -> Ejecutar ->Cerrar Coneccion Es el metodo que usan en PHP, en .Net, en Java. No se si sea el mismo caso en Delphi pero en esto Lenguaje la primera vez que se hace la coneccion si tarda unos 2 y tres segundo pero luego estos aunque esten deconectado las proximas invocaciones a conectar a base de datos es sumamente rapido si la base de datos esta en el mismo servidor dura menos de un segundo.

Para un poco mas de aclaracion googlea DataSnap, DBExpress y Threads

AgustinOrtu 15-11-2015 16:12:47

Leyendo la documentacion de LifeCycle

No habias aclarado que se trataba de un servidor Rest. En ese caso, tal y como dice la documentacion, tenes la propiedad en Invocation

Cita:

Invocation: a new instance is created for each invocation from a client (stateless).
Entonces, cada llamada a un metodo del server va a crear su propio contexo, asi que siempre estarias estableciendo una nueva conexion

ELANDETA 30-11-2015 21:15:28

Gracias a todos,

Ya he probado con FIRE DAC, CON ADO Y Ahora con DBExpress buscando una solucion, durante la ultima prueba he podido notar que las consultas a Base de datos funcionan bien tardan entre 0 y 1 segundo por lo regular, para esto cree un log en la base de datos donde registro el inicio y el fin de cada llamada.

Tambien agregue dos fechas al Server modulo en el Create fechaInicio := Now en el destroy fechaFin := Now; esto lo registro en un archivo log y por igual la repuesta es entre 0 y 1 segundo, pero para mostrar el resultado(JSON) veo que esta tomando 1 y a veces hasta dos segundo mas si sumo el segundo que duraria en consultar en Base de datos con estos dos segundo en mostrar el resultado(JSON) es donde estoy teniendo los dos y tre segundo que demora la aplicacion cliente en invocar al DataSnap.

Lo currioso es que en mi pc de desarrollo ese tiempo en mostrar el json ni se siente. Sera que no estoy incluyendo alguna libreria de DataSNap dentro del ejecutable que coloco en el servidor Windows Server? Sera esto algun problema con la version Delphi 10 Seattle?


La franja horaria es GMT +2. Ahora son las 13:54:20.

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