Pula połączeń (ang. connection pool) to zbiór gotowych połączeń z bazą danych (albo innym zasobem), które aplikacja trzyma otwarte i wielokrotnie używa zamiast otwierać nowe za każdym żądaniem. Otwarcie połączenia to nie jest darmowy ruch: handshake TCP, uwierzytelnienie, negocjacja TLS, alokacja zasobów po stronie serwera bazy. Robienie tego od zera przy każdym zapytaniu, gdy masz setki żądań na sekundę, to prosta droga do tego, żeby baza padła na kolana.
Jak to działa
Przy starcie aplikacji pula otwiera kilka połączeń i trzyma je „na ciepło”. Gdy kod potrzebuje rozmawiać z bazą, wypożycza połączenie z puli, wykonuje zapytanie i zwraca je z powrotem — połączenie nie jest zamykane, tylko czeka na kolejnego klienta. Jeśli wszystkie są zajęte, żądanie czeka w kolejce albo dostaje błąd po przekroczeniu timeoutu.
Pulę opisują zwykle trzy parametry: minimalna liczba połączeń (ile trzymać bezczynnie), maksymalna (twardy sufit) oraz czasy — jak długo czekać na wolne połączenie i po jakim czasie bezczynności je zamknąć. Dobranie tych liczb to połowa zabawy z wydajnością.
Przykład z praktyki
W świecie Javy de facto standardem jest HikariCP, domyślna pula w Spring Boot. Konfiguracja bywa banalna:
spring.datasource.hikari.maximum-pool-size=10spring.datasource.hikari.connection-timeout=30000spring.datasource.hikari.idle-timeout=600000
W Node.js masz pg.Pool dla PostgreSQL, w Pythonie pulowanie ogarnia np. SQLAlchemy (QueuePool), a przed samą bazą często stawia się jeszcze PgBouncer jako zewnętrzny pooler.
Częste błędy i mity
„Większa pula = szybciej” — nieprawda. PostgreSQL nie lubi setek równoległych połączeń; autor HikariCP pokazywał, że często optymalne jest kilkanaście, nie setki. Liczy się liczba rdzeni i dysków bazy, nie Twoje pobożne życzenia.
Connection leak — jeśli zapomnisz zwrócić połączenie (brak close(), wyjątek bez bloku finally / try-with-resources), pula się wyczerpie i aplikacja zawiśnie. Klasyk debugowania o 3 w nocy.
Pamiętaj też, że gdy masz wiele instancji aplikacji, ich pule się sumują — 20 instancji po 10 połączeń to już 200 na bazie. Łatwo przekroczyć max_connections.
Pojęcia powiązane
Warto znać: thread pool, connection timeout, PgBouncer, max_connections, ORM, transakcja oraz keep-alive.