Co to jest pule baz danych?


Odpowiedzi:


230

Pule połączeń z bazą danych to metoda służąca do utrzymywania otwartych połączeń z bazą danych, dzięki czemu mogą być ponownie wykorzystywane przez innych.

Zwykle otwieranie połączenia z bazą danych jest kosztowną operacją, zwłaszcza jeśli baza danych jest zdalna. Musisz otworzyć sesje sieciowe, uwierzytelnić się, sprawdzić autoryzację i tak dalej. Buforowanie utrzymuje połączenia aktywne, więc gdy później zażąda się połączenia, jedno z aktywnych jest używane zamiast tworzyć inne.

Poniższy diagram zawiera kilka następnych akapitów:

  +---------+
  |         |
  | Clients |
+---------+ |
|         |-+  (1)   +------+   (3)    +----------+
| Clients | ===#===> | Open | =======> | RealOpen |
|         |    |     +------+          +----------+
+---------+    |         ^
               |         | (2)
               |     /------\
               |     | Pool |
               |     \------/
           (4) |         ^
               |         | (5)
               |     +-------+   (6)   +-----------+
               #===> | Close | ======> | RealClose |
                     +-------+         +-----------+

W najprostszej formie jest to po prostu podobne wywołanie API (1) do wywołania API otwartego połączenia, które jest podobne do "prawdziwego". Najpierw sprawdza pulę pod kątem odpowiedniego połączenia (2) i, jeśli jest dostępne, zostaje przekazane klientowi. W przeciwnym razie tworzony jest nowy (3).

„Odpowiednie połączenie” to takie, które ma już dostęp do bazy danych przy użyciu poprawnych informacji (takich jak instancja bazy danych, poświadczenia i być może inne rzeczy).

Podobnie, istnieje bliskie wywołanie API (4), które w rzeczywistości nie wywołuje prawdziwego bliskiego połączenia, a raczej umieszcza połączenie w puli (5) do późniejszego użycia. W pewnym momencie połączenia w puli mogą być faktycznie zamknięte (6).

To dość uproszczone wyjaśnienie. Prawdziwe implementacje mogą być w stanie obsłużyć połączenia z wieloma serwerami i wieloma kontami użytkowników, mogą wstępnie przydzielić pewną linię bazową połączeń, aby niektóre były gotowe od razu, i mogą faktycznie zamknąć stare połączenia, gdy wzorzec użycia się uspokoi.


9
Skąd masz ładny mały wykres?
Adrian Grigore

19
Zrobiłem to od zera (głupi ja). Jeśli chcesz zobaczyć przyzwoitą grafikę, spójrz na odpowiedź zengr.
paxdiablo

1
Jeśli jeden jest dostępny, jest przekazywany klientowi, w przeciwnym razie tworzony jest nowy. Podobnie, istnieje bliskie wywołanie API, które w rzeczywistości nie wywołuje prawdziwego bliskiego połączenia, a raczej umieszcza połączenie w puli do późniejszego wykorzystania. Jak o tym wspominasz, mam małe pytanie. Gdy 1000 klientów żąda połączenia i nie jest zamknięte. Więc 1000 połączeń jest aktywne w basenie. To będzie dobre dla wydajności basenu? I daj mi znać, że rozumiem trochę źle?
Ye Win

@YeWin, nie, to brzmi dobrze. Jeśli chodzi o twoje pytanie o pozostawienie 1000 połączeń w puli, to może się zdarzyć, ale generalnie tylko wtedy, gdy w pewnym momencie skończysz z 1000 jednoczesnych aktywnych połączeń. W przeciwnym razie nastąpiłoby ponowne użycie i nie doszłoby do 1000. Jeśli chodzi o to, co się dzieje, zobacz mój przedostatni akapit, zwłaszcza fragment „może faktycznie zamknąć stare połączenia, gdy wzorzec użycia uspokoi się”.
paxdiablo

1
@DiegoMariani, wolniej niż gdybym zrobił to ręcznie, szybciej niż gdybym próbował zmusić MS Word do ułatwienia :-)
paxdiablo

112

Obrazy mówią więcej niż tysiąc słów (paxdiablo dał wspaniały opis):

tekst alternatywny

Źródło


38
I najwyraźniej dobre obrazy mówią również o kilkuset sztukach ASCII :-)
paxdiablo

@sagar, wybierz odpowiedź, która okazała się najbardziej przydatna. Nie masz rekordu akceptacji.
zengr

1
Widziałem 4 połączenia w puli. Więc numer połączenia w tej puli jest ograniczony przez typ puli? Albo co się stanie, gdy połączenie nie będzie wolne w puli? Klient musi czekać na wolne połączenie?
Ye Win

1
@DEADEND To naprawdę zależy od tego, jak zaimplementowana jest pula połączeń. Większość pul tworzy nowe połączenie, gdy połączenia osiągają maksymalną pojemność. To może rosnąć, aż db osiągnie próg. W niektórych przypadkach (takich jak oracle jdbc) możesz określić „rozmiar początkowy” i „rozmiar maksymalny” podczas samej konstrukcji puli.
zengr

2
Niestety obraz nie mówi najważniejszej rzeczy. To znaczy: dlaczego utrzymanie 10, 20, 30, ... otwartych połączeń jest mniej kosztowne dla pamięci i ogólnej wydajności systemu niż otwieranie jednego połączenia, gdy jest to wymagane? Jak to może być? 30 vs. 1 jest mniej kosztowne? W jaki sposób?
Zielony

18

Jak sama nazwa wskazuje. Jeśli kilka osób chce pływać, mogą pływać w tym samym basenie, czy naprawdę ma sens budowanie nowego basenu za każdym razem, gdy ktoś dodaje? Czas i koszt to priorytet.


7

Pule połączeń z bazą danych to po prostu buforowanie połączeń z bazami danych, aby można było ich ponownie użyć następnym razem, aby zmniejszyć koszt ustanawiania nowego połączenia za każdym razem, gdy chcemy łączyć się z bazą danych.



1

Koncepcja puli połączeń nie tylko w Javie, ale także w wielu językach programowania. Tworzenie nowego obiektu połączenia jest kosztowne, więc ustalona liczba połączeń jest tworzona i utrzymywana w cyklu życia, tworząc wirtualną pulę Java Just ( http://javajust.com/javaques.html ) patrz pytanie 14 na tej stronie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.