Załączam moje wywołania linq do sql w klasie repozytorium, która jest tworzona w konstruktorze mojego przeciążonego kontrolera. Konstruktor mojej klasy repozytorium tworzy kontekst danych, tak aby na czas ładowania strony był używany tylko jeden kontekst danych.Dlaczego moje połączenia nie są zamknięte, nawet jeśli jawnie pozbywam się DataContext?
W moim destruktorze klasy repozytoriów wyraźnie nazywam zbycie DataContext, chociaż nie uważam, że jest to konieczne.
Korzystając z monitora wydajności, jeśli obserwuję liczbę połączeń użytkownika i wielokrotnie ładuję stronę, liczba zwiększa się raz na wczytywanie strony. Połączenia nie są zamykane lub ponownie używane (przez około 20 minut).
Próbowałem wstawiania Pooling = false w mojej konfiguracji, aby zobaczyć, czy to miało jakiś wpływ, ale tak się nie stało. W każdym razie przy łączeniu nie spodziewałbym się nowego połączenia dla każdego obciążenia, oczekiwałbym, że ponownie użyje połączeń.
Próbowałem umieścić punkt przerwania w destruktorze, aby upewnić się, że utylizacja jest trafiona i na pewno jest. Więc co się dzieje?
Niektóre kodu do zilustrowania tego, co powiedziałem powyżej:
kontroler:
public class MyController : Controller
{
protected MyRepository rep;
public MyController()
{
rep = new MyRepository();
}
}
Repozytorium:
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
}
Uwaga: dodam kilka wskazówek i informacji kontekście do DC do celów audytu. Jest to w zasadzie dlaczego chcę jednego połączenia za ładowania strony
Aktualizacja: Po wdrożone IDisposable na moim repozytorium i na mojej klasie kontrolera nie mogłem znaleźć sposób, aby specjalnie wywołujemy metodę Dispose na moim kontrolera jako kontroler jest tworzony i niszczony za kulisami przez MvcHandler. Jednak odkryłem, że i tak moje połączenia są zamknięte. I nie było wygodne, wiedząc, że to działa, ale nie wiedząc dlaczego tak zrobiłem kilka kopanie i znaleźć cytat MSDN że mnie ucieszyło:
Kiedy wykonanie jest kompletny, MvcHandler sprawdzi, czy sterownik implementuje IDisposable interfejs, a jeśli tak, wywoła funkcję Dispose na kontrolerze, aby wyczyścić niezarządzane zasoby.
Finał Aktualizacja: Po miesiącu lub tak z pracy to ja teraz wyjąć cały ten kod i zszedł MS zaleca trasę owijania „używając” oświadczenie wokół kodu w moich metodach repozytorium publicznych i przekazywanie tego DC do prywatnych metod. Wydaje się to trochę marnotrawstwem i powtarzalnością, a także powoduje, że kilka kolejnych połączeń jest otwieranych i zamykanych. Ale otrzymywałem linq do sql caching, które mogłem rozwiązać tylko przez zresetowanie DC.
ahh, dzięki. Właśnie zastanawiałem się, czy mój kod wymagał dodania również (odnosząc się do edycji) –
Nie jestem pewien co do ostatniego fragmentu. MVC generuje mój kontroler, więc jak mam się upewnić, że jest prawidłowo utylizowany? –
@Chris, bądź ostrożny przy dziedziczeniu, zauważam, że zrobiłeś pola chronione. Nie zrobiłbym tego. –