Jak działa Connection pool bazy danych ?

0

Okej, wiem, że connection pool przechowuje otwarte połączenia do bazy danych, aby nie wykonywać za każdym razem kosztownego procesu podłączania się na nowo. Po prostu jak przychodzi klient to aplikacja sprawdza czy ma w connection poolu otwarte połączenie i jeżeli ma to klient je dostaje. Ale właśnie - czym jest tutaj klient ? Mógłby ktoś to wyjaśnić na przykładzie CRUDa postawionego na Tomcacie ? Stoi sobie taka apka pod jakimś adresem, wchodzi na nią jakiś użytkownik i pobiera coś z bazy, przychodzi drugi i też coś pobiera. Czy przez fakt, że transfer z i do bazy odbywa się w jednej aplikacji to w connection pool jest tak naprawdę tylko jedno połączenie ? Jeżeli tak to w takim razie kiedy zaczyna być widoczna przewaga dobrego, wydajnego connection pool i kiedy w takiej aplikacji zaobserwowalibyśmy w nim większą ilość połączeń ?

0

Nie, connection pool nie ma (prawie) nic wspólnego z użytkownikiem twojego serwisu. Użytkownikiem w tym momencie jest dowolny proces/wątek (zwał jak zwał), który chce wykonać zapytanie do DB. Z reguły połączeń do DB utrzymujesz więcej niż jedno, bo inaczej tylko jedna osoba na raz mogłaby odpytywać DB, a to trochę mało wydajne. Tak samo mało wydajne jest tworzenie nowego połączenia dla każdego zapytania. Więc co nam pozostaje? Pooling.

Działa to w taki sposób, że odpalasz sobie N połączeń do DB, które są odpalane na starcie aplikacji (N jest konfigurowalne) i są one zarządzane w postaci kolejki. Jak ktoś (inny proces) chce wykonać połączenie do DB, to pool "pożycza mu" dane połączenie na jakiś czas w czasie którego musi on wykonać połączenie i odebrać dane (timeout jest tutaj by zapobiec głodzeniu) a następnie "zwrócić" połączenie do puli. Jeśli jednak wszystkie połączenia są "zajęte" to taki proces ląduje w dodatkowej kolejce (FIFO lub LIFO), która po kolei przydziela połączenia jak tylko zostaną "zwrócone".

0

Okej czyli w puli są połaczenia, a z połączeń korzystają wątki. Ale jak to wygląda w działającej aplikacji, użytkownik chce wyciągnąć dane, więc za pośrednictwem wątku dobiera się do połączenia z poola i je wyciąga ? To by oznaczało, że przy pool size np 50 (chyba tyle jest domyślnie w Hikari, moge sie mylic) tylko 50 użytkowników może w jednej chwili korzystać (wyjmować dane) z bazy. Troche mało jeżeli mówimy o realnej apce typu np sklep.

1

nie do końca mało - należy pisać tak aby samo pobranie trwało jak najkrócej:

  1. nie pobierasz wszystkich towarów i po stronie frontu filtrujesz z tego 10 tylko od razu pobierasz tylko 10
  2. jeśli wyświetlenie jednej pozycji jest czasochłonne bo np. do każdej pozycji dociągasz 20MB zdjęcie to możesz "szybko" zaciągnąć wszystkie dane do np. tablicy, zwolnić połączenie i dopiero obrabiać je dalej.
  3. dla operacji długotrwałych (np. jakieś raporty) możesz mieć osobną pulę połączeń i tutaj wprost komunikować userowi, że już generuje się 50 raportów - poczekaj na swoją kolej.

Przy krótkich połączeniach (a tak powinny one być pisane) user "nie widzi" tego, że np. jego pytanie trafiło do kolejki i musi chwilę poczekać.

0

Ale rozumiem, że w ramach jednego wątku może pobierać dane z bazy w danym momencie tylko jeden user ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1