Maksymalna pula połączeń ograniczona do 100

27

Korzystam z programu SQL Server 2008 R2 z dodatkiem SP1 na komputerze z systemem Windows Server 2008. Mam skrypt .NET uruchomiony z programu Visual Studio 2010, który wykonuje następujące czynności:

  • Sięga do bazy danych
  • Dokonuje zmiany
  • Iteruje

Całkowita liczba iteracji wynosi 150, jednak zatrzymuje się na 100 połączeniach i nie mogę zrozumieć, dlaczego. Mógłbym dostosować mój skrypt, aby używał tylko jednego wątku, ale wolałbym wiedzieć, gdzie brakuje mi ustawienia maksymalnego połączenia, ponieważ będzie to bardziej przydatne w przyszłości.

Oto gdzie sprawdziłem do tej pory:

  • Ciąg połączenia SQL w Visual Studio 2010 (jest ustawiony na 1000)
  • Właściwości połączenia z instancją bazy danych SSMS (jest ustawiona na 0 połączeń użytkownika [nieskończoność])
  • Przeszukano niektóre informacje na temat Server 2008, wygląda na to, że może obsłużyć ponad 100 połączeń
  • Przeszedłem obok mojego kodu, SP_WHO2który daje więcej informacji na temat połączeń logicznych, widząc, że liczba połączeń zaczyna się od 52, a błędy skryptu z błędem „Osiągnięto maksymalną liczbę połączeń w puli” przy 152 połączeniach logicznych.
  • Zmieniono parametry połączenia do użycia Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

Nie wiem, gdzie jeszcze to sprawdzić, wiem, że mam tu wiele ruchomych części, ale mam wrażenie, że gdzieś brakuje mi ustawienia maksymalnego basenu.

Sean Long
źródło
1
Czy możesz opublikować parametry połączenia? Proszę zobaczyć moją odpowiedź. To powinno być twoje rozwiązanie (ta wartość zostanie podana w ciągu połączenia. System.Data.SqlClientDomyślnie jest to 100, dlatego widzisz wyczerpanie puli połączeń).
Thomas Stringer

Odpowiedzi:

24

SQL Server domyślnie dopuszcza maksymalnie 32767 połączeń . Można to zmienić za pomocą sp_configure. Aby wyświetlić bieżącą konfigurację tego ustawienia, użyj następującego zapytania:

select * from sys.configurations
where name ='user connections'

Domyślnie powinna być widoczna maksymalnie 32767, value_in_userówna 0 (użyj ustawień domyślnych). Jeśli to zostało zmienione, możesz ponownie skonfigurować program SQL Server, aby używał innych wartości opisanych w łączu.

Powinieneś również sprawdzić, ile połączeń jest faktycznie nawiązywanych, ponieważ może być więcej aktywności poza twoją aplikacją (lub twoja aplikacja nawiązuje więcej połączeń niż myślisz). Będziesz chciał spojrzeć na Statystyki ogólne -> Połączenia logiczne w perfmon lub zapytać o wartości w sys.dm_os_performance_counters(cntr_value pokaże bieżący punkt w wartości czasu):

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'
Mike Fal
źródło
Tak, już sprawdziłem połączenia użytkowników (jest to pierwsza rzecz, do której się udałem i najłatwiej jest je znaleźć zarówno w interfejsie użytkownika, jak i w dokumentacji Microsoftu. Przeszedłem również swój kod i sprawdziłem liczbę logicznych połączeń przez SSMS przez za pomocą SP_WHO2, która daje przyzwoitą ilość informacji o logicznych połączeniach. Na biegu jałowym mój serwer ma 51 połączeń. Gdy skrypt zawiedzie, ma 100 dodatkowych połączeń. W ten sposób dotarłem do miejsca, w którym teraz jestem.
Sean Long
Wyjaśniłem nieco moje pytanie krokami, które podjąłem. Może to wcale nie być ustawienie w SQL, dlatego zacząłem patrzeć na ustawienia Windows i Visual Studio.
Sean Long,
1
Jeśli wszystko to zaznaczyłeś, a mimo to nadal nie działa przy 100 połączeniach, odpowiedź leży poza ustawieniami bazy danych. Do twojej wiadomości, te 51 połączeń to wszystkie procesy systemowe (+1 dla ciebie).
Mike Fal,
Aby zapewnić pewne zamknięcie, ten ostatni komentarz okazał się poprawny. Przyjrzałem się bliżej, dlaczego powstało 100 połączeń i odkryłem wyciek w kodzie. Po ustaleniu, że działa dobrze. Wszystkie powyższe informacje są jednak nadal bardzo przydatne i mam nadzieję, że inni również je uznają.
Sean Long,
25

W parametrze połączenia określ max pool size=<your desired max pool size>. Innymi słowy, jeśli chcesz zmienić maksymalny rozmiar puli na wartość 500, łańcuch połączenia może wyglądać następująco:

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

Oczywiście zakładam tak dużo z innymi parametrami, ale to powinno dać ci dobry pomysł, jak postępować. Pula połączeń jest wymuszaniem dostawcy po stronie klienta. To klient będzie musiał określić to ustawienie maksymalnego rozmiaru puli za pomocą ciągu połączenia.

Upewnij się również, że prawidłowo zamykasz lub pozbywasz się połączeń, w przeciwnym razie będziesz wiązać połączenia. Coś w tym stylu (C #):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

usingBlok (w języku C #) zwraca IDisposable.Dispose()po zakończeniu. Możesz także zaimplementować SqlConnection.Dispose()lub SqlConnection.Close()w finallybloku try/catch/finallybloku.

Odwołanie: Dokumentacja MSDN dotycząca właściwości SqlConnection.ConnectionString

Thomas Stringer
źródło
Oto ciąg połączenia, aktualizujący również moje pytanie. Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long,
3
Czy to wszędzie twój ciąg połączenia ? Pytam, ponieważ różne ciągi połączeń będą różnymi pulami połączeń.
Thomas Stringer,
To bardzo, bardzo dobre pytanie. Do tej pory sprawdziłem 3 parametry połączenia, ale wszystkie naciskają na wysoką maksymalną pulę. Zobaczę, czy uda mi się znaleźć inny ciąg znaków, który mógłby to spowodować.
Sean Long,
Jeśli po prostu debugujesz wykonanie, powinieneś być w stanie sprawdzić, jaka jest wartość środowiska wykonawczego SqlConnection.ConnectionStringdla danej operacji. To byłby najłatwiejszy sposób. Jeśli max pool sizenie ma, to jest 100.
Thomas Stringer
1
Powinno to zostać oznaczone jako zaakceptowana odpowiedź, ponieważ faktycznie odpowiada OP poprawnie. Wspomina zarówno parametr połączenia maksymalnego rozmiaru puli klienta, jak i potrzebę zamykania / usuwania połączeń.
Adam Caviness,