Temat: Połączenie z bazą
Od tego, co chcesz uzyskać.
Dobrą szkołą jest zamykanie połączeń z bazą danych, ponieważ połączenie jest zasobem, a zasoby są ograniczone (korzystają z potoków, gniazd, slotów i innych zasobów, których jest w systemie ograniczona liczba). Zaleca się tu wykorzystanie z "using", wykonanie co potrzeba, zasilenie DataSetów, zamknięcie połączenia i pozostawienie "usingowi" zwolnienie zasobów (ew. można zamykanie przenieść samemu do destruktora, ale nie poleca się, m.in. z uwagi na problem wyjątków - znane jeszcze z książek o C++), a potem ew. merdżowanie DataSetów. NHibernate też pozwala pracować na "detached" obiektach. I też operuje pojęciem sesji. I też opisywane są różne "kejsy" w zależności od tego, co jest potrzebne.
Czasem musisz mieć na bieżąco dostęp do bazy ze względu na dynamiczne widoki, "wędrowanie okienkiem po długich listach" w przypadku, gdy dane w bazie mogą się nieustannie zmieniać. I wtedy nie chcesz ciągle otwierać połączenia i go zamykać z uwagi na czas.
A czasem pobierasz komplet danych do DataSetu, odłączasz się od bazy (w której dane zmieniają się rzadko) i działasz lokalnie, ew. tylko potem synchronizując oba zbiory danych (DataSet, baza).
W jednych aplikacjach dostęp do bazy jest zawsze (pomijając awarie sieci), a niektóre oferują tryb pracy offline i muszą "żonglować" połączeniami i przechowywać lokalnie dane (np. jako odwzorowanie XML DataSetu).
Do jednych łączy się jednocześnie pięciu userów, do innych - pieć tysięcy. Czasem jest jedno połączenie na dzień, czasem 200 na minutę.
Z tym wiąże się także problem blokad na rekordach. Jeśli będziesz miał stałe połączenie, możesz stosować mechanizmy bazodanowe (transakcyjne). Jeśli nie będziesz miał stałego połączenia, musisz robić własne locki (flagi + przeglądanie listy sesji), bo transakcyjne wygasną po zamknięciu połączenia (sesji).
Sam musisz zdecydować, czego potrzebujesz.
Jest tylko jeden ogólnik, "od zawsze" - oszczędnie z połączeniami. A co to znaczy "oszczędnie"? " Tylko tyle, ile
rzeczywiście jest potrzebnych".
Adrian Olszewski edytował(a) ten post dnia 31.07.09 o godzinie 14:23