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_WHO2
któ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.
sql-server
Sean Long
źródło
źródło
System.Data.SqlClient
Domyślnie jest to 100, dlatego widzisz wyczerpanie puli połączeń).Odpowiedzi:
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:Domyślnie powinna być widoczna maksymalnie 32767,
value_in_use
ró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):źródło
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: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 #):
using
Blok (w języku C #) zwracaIDisposable.Dispose()
po zakończeniu. Możesz także zaimplementowaćSqlConnection.Dispose()
lubSqlConnection.Close()
wfinally
blokutry/catch/finally
bloku.Odwołanie: Dokumentacja MSDN dotycząca właściwości SqlConnection.ConnectionString
źródło
Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
SqlConnection.ConnectionString
dla danej operacji. To byłby najłatwiejszy sposób. Jeślimax pool size
nie ma, to jest 100.