sobota, 19 stycznia 2013

70-516 Połączeniowy model danych - łączenie do źródeł

Za pomocą tzw. providerów możemy łączyć się do różnych źródeł danych w celu pobrania z nich danych, jak i zapisania ich.
Microsoft udostępnia kilka gotowych implementacji, jak i gamę interfejsów umożliwiających napisanie własnego providera. Dostępne providery:
  • OleDb - SQL Server, SyBase, DB2/400. Microsoft Access
  • Odbc - połączenie do wielu źródeł danych
  • SQL Server - MS SQL
W sieci można znaleźć wiele gotowych providerów.


Obiekt połączenia  - DbConnection
Aby móc pobierać i wysyłać dane należy stworzyć połączenie do źródła danych. Podczas tworzenia obiektu połączenia należy podać ConnectionString, który wskazuje gdzie znajduje się źródło i przekazuje dodatkowe parametry. Po zakończeniu pracy z źródłem, połączenie należy zamknąć aby zwolnić używane zasoby.
Przykład stworzenia połączenia:

Code:
            var sqlConnection = new SqlConnection("Server=localhost;Database=AdventureWorks;Trusted_Connection=True;");
            sqlConnection.Open();
            //Operacje na połączeniu
            sqlConnection.Close();

Warto sobie zapisać adres strony http://www.connectionstrings.com. Zawiera ona potrzebne dane do połączenia z bazami danych, plikami danych oraz innymi źródłami.


Przechowywanie ConnectionString-a
ConnectionString najlepiej przechowywać w jednej z podanych lokalizacji:
  • app.config
  • web.config
  • machine.config
Pliki te to XMLe. Dzięki temu w przypadku zmian, nie będzie wymagana ponowna kompilacja oprogramowania.
Dodatkowo dzięki klasie ConfigurationManager w łatwy sposób wydobędziemy informacje potrzebne do połączenia z bazą danych. 
Przykład:

Code:
  <connectionStrings>
    <clear/>
    <add name="db" providerName="System.Data.SqlClient" connectionString="Server=localhost;Database=AdventureWorksLT;Trusted_Connection=True;"/>
  </connectionStrings>

Pobranie tak zdefiniowane ConnectionString-a:

Code:
            var connectionStringSettings = ConfigurationManager.ConnectionStrings["db"];
            using (var connection = new SqlConnection(connectionStringSettings.ConnectionString))
            {
                //operacje
            }




Connection Pool
Tworzenie połączenia do bazy danych jest kosztowne. Aby zaradzić temu problemowi oferowany jest connection pool. Wyobrazić sobie można go jako cache o określonej wielkości. Gdy aplikacja potrzebuje połączenia, sprawdza czy w connection poolu istnieje wolne. Jeżeli tak zwraca je. Jeżeli nie istnieje wolne, ale nie osiągnięto jeszcze maksymalnej wielkości app poola, połączenie zostanie stworzone i zwrócone. Ostania ewentualność to brak wolnych połączeń i osiągnięcie maksymalnej wielkości connection poola. W takim przypadku żądanie o połączenie zostanie umieszczone w kolejce i po zwolnieniu przez inną aplikację połączenia - przydzielone do oczekującej aplikacji.
Connection pool kontrolowany jest przez parametry przekazywane do connection string-a. Możemy między innymi ustalić minimalną i maksymalną wielkość cache, czy połączenie ma być resetowane.

Aby connection pool działał, muszą być spełnione następujące warunki:
  • connection string dla każdego połączenia musi być takie same (dotyczy także wielkości znaków)
  • user id dla każdego procesu musi być takie same (jeżeli nie logujemy się za pomocą loginu i hasła, zostanie pobrany login konta systemowego)
  • ID procesu musi być taki sam
Jak widać z powyższej listy mamy do czynienia z wieloma ograniczeniami. Kiedy więc connection pool jest najbardziej opłacalny? W przypadku aplikacji webowych, gdzie łączymy się do serwera bazy danych zawsze za pomocą tego samego użytkownika.
Fakty odnoście connection pool:
  • Cache tworzony jest po stronie klienta aplikacji - aplikacja serwerowa nie wie o nim. 
  • connection pool tworzony jest po pierwszym utworzeniu połączenia i otarciu go
  • połączenie w connection pool przebywa domyślnie od 4 - 8 minut. Jeżeli chcemy, aby zawsze było dostępne jedno lub więcej należy zdefiniować tę liczbę w connection stringu
  • domyślnie connection pool ustawiony jest na maksymalnie 100 połączeń. Ilość użytych połączeń można sprawdzić w narzędziu Performance Monitor
  • connection pool można wyłączyć, jednak nie jest to zalecane i może znacząco obniżyć wydajność naszej aplikacji
  • czyścić connection pool możemy za pomocą statycznych metod połączenia: ClearPool oraz ClearAllPools

Brak komentarzy:

Prześlij komentarz