Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Servidor y cliente DataSnap (https://www.clubdelphi.com/foros/showthread.php?t=86632)

cmfab 10-09-2014 13:46:50

Servidor y cliente DataSnap
 
Hola a todos, tengo un servidor DataSnap con una conexión a una Base de Datos de SQL Server, en él un par de métodos de consultas a tablas de la BD para obtener el saldo de un cliente determinado.

En la aplicación cliente tengo un TTimer que cada 3 segundos ocupa usar esas consultas para mostrar el saldo actualizado del cliente. lo que me está sucediendo es que a al final de todos los días después de unas horas de que el cliente tenga la aplicación abierta y esté el Timer activado para refrescar el saldo, aparece el error siguiente:

Connection Closed Gracefully

Cuando reviso el Server tengo que matar el proceso porque no responde y reiniciarlo de nuevo, entonces es que el cliente puede recomenzar el trabajo. alguna sugerencia de porqué puede estar pasando esto ?

Gracias por sus atenciones

duilioisola 10-09-2014 14:14:57

Por lo que comentas, el error está en la parte Servidor.
Supongo que cada vez que se le solicita la información hace algo con las consultas que va cargando el servidor.

Puede ser que tenga que ver con transacciones que se van acumulando y nunca hacen commit.
Esto no se como mirarlo en SQLServer, pero seguramente habrá algún contador de transacciones. Trata siempre de utilizar transacciones en modo ReadOnly, siempre que puedas

Puede ser que no liberes algún componente que creas dinámicamente y cargues la memoria hasta su límite.
Verifica como va creciendo el consumo de memoria en el servidor.
Para agilizar esto puedes hacer que la aplicación cliente pida la información cada medio segundo o menos.

Puede ser que el calculo que hace genere una excepción en "ciertas condiciones raras" y que no se trate y por lo tanto cierre el programa.
Quizás haya algún caso en el que divida por 0, por ejemplo, en algún momento del día en el que el cliente tiene saldo 0.

cmfab 10-09-2014 14:20:32

Gracias por responder, pero es que no uso commit porque lo que tengo son dos consultas de selección, una consulta suma todos los depósitos del cliente y la otra todas las ventas ya la diferencia me arroja el saldo, son los métodos que mas se usan cada 3 segundo, el tercer método que uso en el server es una consulta también de selección para mostrar las ventas en la aplicación cliente en un rango de fecha determinado, osea que son cosas bien básicas

jgutti 10-09-2014 14:40:38

hola, yo trabajo con datasnap y el mensaje que publicas se produce al perder la conexión del cliente con el servidor, esto sucede si en la red se produce variaciones o perdidas de la señal entre un punto y otro
- Prueba desconectando el cable de red en uno de los computadores (servidor o cliente) , esto replica el mensaje
- Si el problemas corresponde al punto anterior, solo deberias reiniciar el cliente

- saludos
jgs

cmfab 10-09-2014 14:59:46

Gracias, es muy buena idea esa prueba que comentas, pero el tema no es ese, el tema es que el server se queda pegado, ahí está el principal problema, porque el cliente puede en cualquier momento cerrar la aplicación y volverla a abrir, pero es inconveniente que esto se haga en el servidor a cada momento.

jgutti 10-09-2014 16:52:08

y en reemplazo de un timer , utilizar un boton refresh activado por el usuario
- Por lo que entiendo realiza una consulta por cliente, si es correcto solo realizar una consulta con parametros que muestre Saldo del cliente solicitado

duilioisola 10-09-2014 17:14:31

Cita:

no uso commit porque lo que tengo son dos consultas de selección
Según tengo entendido, toda sentencia SQL se ejecuta en una transacción. La transacción puede ser de "solo lectura" o "lectura/escritura" (y alguna otra variante que no viene al caso).
Asegúrate de que la transacción sea de "solo lectura". Esto no se como se hace en SQL Server. Suele ser un parámetro que utilizas en la conexión, si no utilizas transacciones explícitamente.
También puedes abrir y cerrar la conexión cada vez que haces la consulta. Esto suele hacer las cosas un poco más lentas y un poco mas pesadas en el servidor de base de datos. Si no influye demasiado esta sería una buena solución.

De todos modos:
¿Has verificado si luego de muchas llamadas el consumo de memoria en el servidor que contiene el servidor DataSnap se desborda?
¿Has verificado si luego de muchas llamadas el consumo de memoria en el servidor que contiene el servidor de base de datos se desborda?
¿Has verificado el contador de transacciones del servidor de base de datos?
¿Estás seguro de que el servidor no generó ninguna excepción que lo deje pegado?

También se me ocurre que el servidor DataSnap puede estar esperando una respuesta del servidor de base de datos y hasta que no obtenga su respuesta se queda pegado. Esto puede deberse a algún bloqueo de tablas, pero sería raro.

cmfab 10-09-2014 22:44:02

Gracias jgutti y duilioisola por sus respuestas he decidí probar quitando el timer, desde hace unas horas todo ha ido bien, espero que así siga, ahora en cuanto a las preguntas que me haces duilioisola, la verdad que no tengo mucha idea de como verificar esos parámetros, algún lugar donde leer como hacerlo ?

duilioisola 11-09-2014 00:06:34

Para verificar el estado de la memoria, bastaría con abrir el TaskManager (Administrador de Tareas) en el ordenador que tiene el servidor DataSnap y ver la gráfica de la memoria.
Puedes hacer que el refresco sea lento, si vas a esperar mucho (Velocidad de actualizacion --> Baja).

Si sube y nunca baja, quiere decir que se está perdiendo por algún sitio...

cmfab 11-09-2014 15:03:27

Gracias por todo, bueno os comento que desde ayer todo anda bien, así que pienso que el timer de 3 segundos aunque no lo parezca estaba influyendo en la carga del servidor, de igual forma voy a revisar la posible saturación de la memoria como me indicas.


La franja horaria es GMT +2. Ahora son las 08:07:39.

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