Encapsulo mis llamadas de linq a sql en una clase de repositorio que se crea una instancia en el constructor de mi controlador sobrecargado. El constructor de mi clase de repositorio crea el contexto de datos para que, durante la vida de la carga de la página, solo se use un contexto de datos.¿Por qué mis conexiones no están cerradas incluso si elimino explícitamente el DataContext?
En mi destructor de la clase de repositorio, llamo explícitamente a la eliminación del DataContext, aunque no creo que sea necesario.
Utilizando el monitor de rendimiento, si veo mis Conexiones de usuario contar y cargar una página varias veces, el número aumenta una vez por carga de página. Las conexiones no se cierran ni se vuelven a utilizar (durante unos 20 minutos).
Intenté poner Pooling = false en mi configuración para ver si esto tenía algún efecto pero no fue así. En cualquier caso, con la agrupación no esperaría una nueva conexión para cada carga, esperaría que reutilice las conexiones.
He intentado poner un punto de ruptura en el destructor para asegurarme de que el material está siendo golpeado y, por supuesto, lo es. ¿Entonces que esta pasando?
algo de código para ilustrar lo que he dicho anteriormente:
El controlador:
public class MyController : Controller
{
protected MyRepository rep;
public MyController()
{
rep = new MyRepository();
}
}
El repositorio:
public class MyRepository
{
protected MyDataContext dc;
public MyRepository()
{
dc = getDC();
}
~MyRepository()
{
if (dc != null)
{
//if (dc.Connection.State != System.Data.ConnectionState.Closed)
//{
// dc.Connection.Close();
//}
dc.Dispose();
}
}
// etc
}
Nota: añado una serie de consejos e información de contexto a la DC para fines de auditoría. Esta es la razón fundamental por que quiero una conexión por cada carga de la página
Actualización: Después de haber implementado IDisposable en mi repositorio y en mi clase del controlador que no podía encontrar una manera de llamar específicamente al método Dispose en mi controlador ya que el el controlador es creado y destruido detrás de escena por MvcHandler. Sin embargo, encontré que mis conexiones se cerraban de todos modos. No estaba cómodo sabiendo que esta funcionaba pero sin saber por qué así que hice algo de investigación y encontré una cotización de MSDN que me hizo feliz:
Cuando se completa la ejecución, el MvcHandler comprobará si el controlador implementa el IDisposable interfaz, y si es así, invocará Dispose en el controlador para limpiar los recursos no administrados.
Informe final de actualización: Después de un mes más o menos con el que trabaja este Ahora he eliminado todo este código e ido abajo de la MS aconsejó ruta de envolver un "uso" declaración de todo el código en mis métodos de repositorios públicos y pasando esta DC a los métodos privados. Esto parece un poco derrochador y repetitivo, y también da como resultado que se abran y cierren algunas conexiones más. Pero estaba obteniendo linq en sql caché que solo pude resolver reiniciando el DC.
ahh, gracias. Me preguntaba si mi código necesitaba esa adición también (refiriéndose a la edición) –
No estoy tan seguro del último bit. MVC genera mi controlador, entonces, ¿cómo hago para asegurarme de que esté dispuesto correctamente? –
@Chris, solo tenga cuidado al heredar, observo que ha protegido los campos. No lo hubiera hecho –