valid net missing .net linq-to-sql connection-pooling

.net - net - ¿Es posible obtener fugas de conexión sql usando LINQ?



sql connection string properties (3)

Creí que no era posible obtener fugas de conexión sql al usar LINQ, pero el seguimiento perfom de NumberOfReclaimedConnections muestra un número alto y en alta carga a veces obtenemos excepciones como "Tiempo de espera caducado. El tiempo de espera transcurrido antes de obtener una conexión del grupo. Esto puede haber ocurrido porque todas las conexiones agrupadas estaban en uso y se alcanzó el tamaño máximo de la agrupación ".

No usamos Dispose en los datacontexts, ya que utilizamos la carga deferida. Varios artículos y blogpost me dicen que esto no debería ser un problema.

Todavía tenemos estas excepciones a veces. Pero no puede ser que cada consulta de linq mantenga abierta la conexión, entonces tendríamos muchas más excepciones.

Editado

La aplicación es un servicio WCF.

Si observa la documentación de Linq y la mayoría de los artículos, afirman que el Dispose no es necesario para liberar las conexiones. Ellos afirman que DataCOntext solo mantiene la conexión abierta por el corto tiempo que la necesita.


¿Estás teniendo bloqueos en tu base de datos? Una rápida mirada al Activity Monitor debería darle alguna indicación.

¿Qué hace para administrar el ciclo de vida de DataContext? ¿Qué tipo de aplicación ha escrito (un sitio web, un cliente de Windows, otro)?

Una vez utilizado en una consulta u operación, un DataContext mantendrá una conexión para que las entidades cargadas puedan cargar de forma diferida & etc, por lo que es imperativo que planifique cómo usa DataContexts en su aplicación.

Servicios de WCF. En ese caso, soy un gran admirador del enfoque de "un contexto por solicitud". Le recomiendo que ajuste sus operaciones de datos dentro de una declaración using () para que el contexto se elimine cuando haya terminado.


Después de buscar un poco más encontré esta pregunta y respuesta , donde dice que linq puede ser engañado para dejar una conexión abierta.

Hice este pequeño código de prueba que lo reproduce. Si simplemente reemplazo el Enumerator con foreach, funciona bien, pero el Enumerator mantiene las conexiones abiertas.

public Organisation RunTestQuery2() { IEnumerable<Organisation> orgs = base.GetEntities<Organisation>().Take(5); var enumerator = orgs.GetEnumerator(); int i = 0; while (enumerator.MoveNext()) { var org = enumerator.Current; Debug.WriteLine(org.DescribingName); if (i == 3) { return org; } i++; } return null; }

Si agrego una llamada para eliminar en el contexto, desaparece.


Cuando su DataContext no se elimina y permanece vivo, la conexión asociada también permanecerá activa. Las conexiones a la base de datos son recursos no administrados y todos los recursos no administrados se deben eliminar de forma adecuada.

Incluso si usa la carga de retraso y no tiene un ámbito bien definido, debe limpiar las conexiones de la base de datos al final de una unidad lógica de trabajo. En las aplicaciones ASP.NET, el último momento posible para esto sería al final del proceso de solicitud, en el método Application_EndRequest del archivo Globals.asax. En un servicio WCF, cualquier contexto de datos activo debe desecharse al final de cada llamada al método de servicio.

La documentación para esto es vaga y, aunque la mayoría de las veces, puede salirse con la suya al no deshacerse de su DataContext, parece que hay algunos escenarios donde los datos cargados de una conexión mantienen viva la conexión. La manera más fácil de confirmar que esto está sucediendo en su caso es probarlo.