Jak działa pula połączeń ADO.Net?

Połączenie z bazą danych to operacja wymagająca dużej ilości zasobów, która zwykle obejmuje kilka kroków. Kanał komunikacji między aplikacją a bazą danych powinien zostać ustanowiony przed początkowym uzgadnianiem z serwerem bazy danych. Ten kanał może być gniazdem lub nazwaną potoką. Po ustanowieniu tego połączenia i pomyślnym nawiązaniu połączenia wstępnego z serwerem, metadane połączenia (informacje o parametrach połączenia do połączenia z bazą danych) są analizowane, a połączenie z bazą danych jest uwierzytelniane przez serwer bazy danych.

ADO.Net od dawna jest jedną z najpopularniejszych platform dostępu do danych. Pule połączeń to funkcja ADO.Net, która umożliwia poprawę wydajności dostępu do danych w aplikacji.

Co to jest pula połączeń?

Pula połączeń to strategia stosowana w celu zminimalizowania kosztów związanych z otwieraniem i zamykaniem połączeń z bazą danych. Umożliwia ponowne wykorzystanie połączeń zamiast tworzenia nowych połączeń z bazą danych w momencie, gdy są one wymagane.

Pula połączeń zawiera zbiór bezczynnych, otwartych połączeń wielokrotnego użytku. Pooler zarządza pulą połączeń i utrzymuje zestaw aktywnych połączeń dla każdego podanego metadanych połączenia, informacji o konfiguracji połączenia.

Należy pamiętać, że w tej samej domenie aplikacji może istnieć wiele pul połączeń. Pula połączeń jest tworzona dla unikatowych parametrów połączenia używanych do łączenia się z bazą danych, a nie dla bazy danych. Tak więc przy pierwszym połączeniu z bazą danych z określonymi parametrami połączenia tworzona jest nowa pula połączeń. Gdy następnym razem łączysz się z tą samą bazą danych z tymi samymi parametrami połączenia, nie jest tworzona nowa pula połączeń, a raczej używana jest istniejąca pula połączeń.

Należy zauważyć, że w przypadku korzystania z zabezpieczeń zintegrowanych dla każdego użytkownika uzyskującego dostęp do systemu klienckiego utworzona zostanie pula połączeń, tj. Połączenia są gromadzone według tożsamości systemu Windows. W związku z tym MSDN stwierdza: „Kiedy połączenie jest otwierane po raz pierwszy, pula połączeń jest tworzona na podstawie dokładnego algorytmu dopasowującego, który kojarzy pulę z ciągiem połączenia w połączeniu. Każda pula połączeń jest powiązana z innym ciągiem połączenia. Po otwarciu nowego połączenia, jeśli parametry połączenia nie są dokładnie dopasowane do istniejącej puli, tworzona jest nowa pula. "

Konfigurowanie puli połączeń

Jak kontrolujesz zachowanie puli połączeń? Cóż, możesz zarządzać pulami połączeń, używając określonych słów kluczowych w ciągu połączenia. Najważniejsze z nich to:

  • ConnectionTimeout - służy do określenia okresu oczekiwania (w sekundach), kiedy żądane jest nowe połączenie z bazą danych. Wartość domyślna to 15.
  • MinPoolSize - reprezentuje minimalną liczbę połączeń w puli.
  • MaxPoolSize - reprezentuje maksymalną liczbę połączeń w puli. Wartość domyślna to 100.
  • Buforowanie - kontroluje, czy buforowanie połączeń jest włączone, czy wyłączone i może mieć wartość true lub false. W przypadku ustawienia wartości true żądane połączenie jest pobierane z odpowiedniej puli połączeń.

Poniższy fragment kodu ilustruje, jak można skonfigurować pulę połączeń przy użyciu parametrów połączenia:

string connectionString="Data Source=localhost;Initial Catalog=Sample; Integrated security=SSPI;Connection Timeout=30; Connection Lifetime=0;Min Pool Size=0;Max Pool Size=100;Pooling=true;";

using (SqlConnection connection = new SqlConnection(connectionString))

{

   connection.Open();

   //Write code here to perform CRUD operations on the Sample database

}

Można monitorować zachowanie puli połączeń, wykonując procedury składowane sp_who lub sp_who2 w programie SQL Server. Możesz również użyć programu SQL Server Profiler lub skorzystać z liczników wydajności do monitorowania zachowania puli połączeń.

Istnieje kilka potencjalnych problemów z buforowaniem połączeń. Jedną z takich kwestii jest fragmentacja puli. Podczas pracy z pulą połączeń należy być świadomym fragmentacji puli i upewnić się, że zostały zastosowane odpowiednie środki (architektura powinna być zaprojektowana tak, aby uwzględniać strategie ograniczania fragmentacji puli), aby uniknąć fragmentacji puli. Zwróć uwagę, że fragmentacja puli może wystąpić, jeśli używasz zintegrowanych zabezpieczeń, a nawet jeśli aplikacja używa zbyt wielu pul połączeń.

Aby upewnić się, że buforowanie połączeń działa wydajnie, należy zamykać połączenia z bazą danych, gdy nie są już potrzebne. Nigdy nie należy wywoływać metody Close lub Dispose w wystąpieniu Connection w metodzie Finalize. Należy również zamknąć wystąpienia transakcji przed zamknięciem lub usunięciem powiązanych obiektów połączeń. Oto miła lektura na ten temat.