2011-07-06 23 views
10

Mam problem w kodzie, który napisałem przy użyciu .NET.Jak znaleźć to, co używa połączeń w mojej puli połączeń

Problem polega na tym, że gdzieś mam trochę podejrzanie kod bazy danych Oznacza to, że po pewnym czasie pojawia się następujący błąd:

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

wiem, że to dlatego, że gdzieś nie mam wyrzucać jednego z moim datareaders lub coś podobnego, co oznacza, że ​​nadal ma otwarte połączenie, więc nie jest ono zwracane do puli. Mam jednak problem ze znalezieniem tego, co dzieje się w moim kodzie.

Więc moje pytanie:

Czy istnieje jakiś sposób, aby zapytać puli połączeń, aby dowiedzieć się, co jej zastosowania w połączeniach robią. Po prostu szukam sposobu, aby znaleźć zapytanie, które jest uruchamiane, aby umożliwić mi znalezienie obraźliwego fragmentu kodu.

Za to, co jest warte, nie mam uprawnień do uruchomienia monitora aktywności w bazie danych, aby dowiedzieć się w ten sposób.

+0

jakiej wersji programu ramowego używasz? –

+0

@Conrad: Wersja 2.0 – Chris

Odpowiedz

12

Is there any way to query the connection pool to find out what its in use connections are doing.

Nie. Nie. Pula połączeń jest czymś, co utrzymuje twoja aplikacja (w rzeczywistości jest to List<DbConnectionInternal>) Jeśli naprawdę chcesz, możesz uzyskać dostęp do połączeń w puli poprzez odbicie lub debugowanie, za pośrednictwem lokalnego lub okna oglądania (patrz poniżej), ale możesz nie dostanie się do tego, co dzieje się na tym połączeniu lub który obiekt powinien był nazwać Connection.Close (lub Dispose). Więc to nie pomoże

enter image description here

Jeśli masz szczęście można wykonać sp_who lub sp_who2 w tej chwili można uzyskać limit czasu, kiedy już zabraknie połączeń zbiorczych kiedy jednak jego wysoce prawdopodobne, że większość wyniki będą wyglądać tak.

SPID Staus Login Hostname Blkby DBname Command   .... 
---- ------- ----- --------- ----- ------ ---------------- 
79 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
80 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
81 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 
82 sleeping uName WebServer .  YourDb AWAITING COMMAND ..... 

Co oznacza, że ​​tak, Twoja aplikacja otworzyła wiele połączeń i nie zamknęła ich, a nawet nie robi nic z nimi.

Najlepszym sposobem na walkę z tym problemem jest profilowanie aplikacji za pomocą ADO.NET Performance Counters i uważne przyglądanie się NumberOfReclaimedConnections, a także dokładny przegląd kodu.

Jeśli jesteś naprawdę zdesperowany, możesz wyczyścić pulę, gdy napotkasz ten problem.

using (SqlConnection cnn = new SqlConnection("YourCnnString")) 
{ 

    try 
    { 
      cnn.Open(); 
    } 
    catch (InvalidOperationException) 
    { 
      SqlConnection.ClearPool(cnn); 
    } 
    cnn.Open(); 

} 

Mam jednak przestrzec przed tym, ponieważ ma potencjał zadławienia serwer DB, ponieważ umożliwia aplikacja do otwierania jak wiele połączeń jako serwer pozwoli zanim to po prostu zabraknie zasobów.

+0

Dziękuję Conrad.To wygląda na dość wyczerpującą odpowiedź i powiedziałem, co podejrzewałem.W końcu zdecydowałem, że jestem niezadowolony ze sposobu, w jaki został zapisany dostęp do bazy danych, a skończyło się na przeglądzie go w całości, ale przydaje się to w przyszłości, zwłaszcza wskazówki, jak znaleźć pulę połączeń w oknie oglądania. :) – Chris

2

Czy próbowałeś załadować SSMS i uruchomić sp_who2 w bazie danych, o której mowa?

USE [SomeDatabase] 
EXEC sp_who2 

To powinno pokazać, co dzieje się w danej chwili.

+0

Po prostu wypróbowałem (sp_who2, jeśli chcesz poprawić swój błąd), ale tylko zwróciło moje bieżące połączenie.Próbowałem zmienić moje połączenie, aby używać tych samych ustawień połączenia co kod, ale wciąż pokazywałem tylko jeden wiersz, który wydawał mi się moim bieżącym połączeniem. Zakładam, że jest to ten sam problem z uprawnieniami, który uniemożliwia mi uruchomienie monitora aktywności. :(Dzięki za sugestię .. – Chris

Powiązane problemy