Es normal que los procesos se queden abiertos?

16/07/2005 - 12:44 por Jesús Bosch Aiguadé | Informe spam
Buenos dias,

Accediendo a SQLSERVER desde ASP.NET, he observado que se me abren procesos
en la BD (lógico no? administrador corporativo->administración->actividad
actual ->información del proceso).

Cada vez que abro una conexión a la BD desde sqlclient de .net, un nuevo
proceso aparece en la lista, hasta aquí bien. Lo sorpendente, es que tras
cerrar las conexiones, el proceso sigue allí! (conn.close hecho,
evidentemente) A veces, tras cerrar la conexión hago conn.dispose(), y
quedan menos procesos abiertos, pero siguen quedando algunos!

En una aplicación grande que estoy haciendo, al final tengo cientos de
procesos, y llega un punto en el que el SQLSERVER ya no puede más y me
devuelve el error:

Valor de tiempo de espera caducado. El período de tiempo de espera expiró
antes de obtener una conexión del grupo. Esto puede suceder porque todas las
conexiones de la agrupación estaban en uso y se alcanzó el máximo tamaño del
grupo.
Descripción: Excepción no controlada al ejecutar la solicitud Web actual.
Revise el seguimiento de la pila para obtener más información acerca del
error y dónde se originó en el código.

Detalles de la excepción: System.InvalidOperationException: Valor de tiempo
de espera caducado. El período de tiempo de espera expiró antes de obtener
una conexión del grupo. Esto puede suceder porque todas las conexiones de la
agrupación estaban en uso y se alcanzó el máximo tamaño del grupo



He buscado por internet y he visto que MUCHOS tienen el mismo problema, pero
no hay soluciones. Algunos proponen alargar el timeout, pero con eso no se
arregla nada, ya que los procesos siguen quedando abiertos...

Gracias de antemano por su ayuda,

Jesús

Preguntas similare

Leer las respuestas

#1 A.Poblacion
16/07/2005 - 19:02 | Informe spam
"Jesús Bosch Aiguadé" wrote in message
news:
Cada vez que abro una conexión a la BD desde sqlclient de .net, un nuevo
proceso aparece en la lista, hasta aquí bien. Lo sorpendente, es que tras
cerrar las conexiones, el proceso sigue allí! (conn.close hecho,
evidentemente)



El conn.Close() no cierra la conexión. Lo que hace es devolverla al pool
de conexiones. Esa conexión no se desperdicia, sino que la siguiente vez que
haces un Open de una conexión usando una cadena de conexión idéntica a la
anterior, te recupera la conexión del pool en lugar de abrir una nueva.

En una aplicación grande que estoy haciendo, al final tengo cientos de
procesos, y llega un punto en el que el SQLSERVER ya no puede más y me
devuelve el error:
Valor de tiempo de espera caducado.



Con toda seguridad, en algún sitio se te ha olvidado cerrar alguna
conexión. Lo que te ocurre es que, al omitir el Close, la conexión no se
devuelve al pool, y entonces la siguiente vez que se abre una, en lugar de
recuperarla del pool se crea una nueva. Cuando se alcanza el valor máximo
(100 por defecto), se queda esperando que algún proceso cierre alguna de las
abiertas, y como no las cierras, pues acaba dando un timeout al cabo de unos
segundos.

[...]
He buscado por internet y he visto que MUCHOS tienen el mismo problema,


pero
no hay soluciones.



La solución es SIEMPRE, en TODOS los sitios de tu programa donde se use una
conexión SQL, poner todo el bloque en un Try..Catch, y hacer un Close() de
la conexión en el Finally del Try..Catch.
Respuesta Responder a este mensaje
#2 Carlos Gómez
17/07/2005 - 10:28 | Informe spam
Con toda seguridad, en algún sitio se te ha olvidado cerrar alguna
conexión. Lo que te ocurre es que, al omitir el Close, la conexión no se
devuelve al pool, y entonces la siguiente vez que se abre una, en lugar de
recuperarla del pool se crea una nueva. Cuando se alcanza el valor máximo
(100 por defecto), se queda esperando que algún proceso cierre alguna de
las abiertas, y como no las cierras, pues acaba dando un timeout al cabo
de unos segundos.




suele ser debido a que se te ha olvidado cerrar un datareader. El datareader
cierra automà¡ticamente la conexion con .Close siempre y cuando lo hayas
especificado en el objeto command mediante CommandBehavior.CloseConnection.
Si no lo has hecho asà­, tienes que cerrar expresamente la conexion después
de cerrar el dataReader

Es un error puà±etero, porque no aparece hasta que se han abierto un nàºmero
elevado de conexiones, y por este motivo, cuando està¡s en fase de
desarrollo pasa desapercibido durante mucho tiempo (si es que llega a
aparecer).
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida