Pula połączeń z HikariCP
Wydajne ponowne wykorzystywanie połączeń
Pula połączeń z HikariCP to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.
Po co korzystać z puli połączeń
Otwarcie połączenia z bazą danych jest kosztowne: uzgadnianie połączenia TCP, uwierzytelnianie i konfiguracja sesji mogą trwać dziesiątki milisekund.
Pula połączeń utrzymuje zestaw otwartych połączeń w gotowości. Kod pobiera jedno z nich, korzysta z niego i zwraca je do puli — kosztowne otwarcie zostaje zastąpione szybkim pobraniem.
Poznajemy HikariCP
HikariCP to de facto standardowa pula połączeń w Javie. Jest niewielka, szybka i domyślnie używana w Spring Boot.
Implementuje interfejs javax.sql.DataSource, dlatego reszta kodu JDBC pozostaje bez zmian — połączenia są tylko pobierane z puli zamiast z DriverManager.
Konfigurowanie puli
HikariCP konfiguruje się za pomocą obiektu HikariConfig, podając adres URL JDBC, dane uwierzytelniające i rozmiar puli.
Następnie tworzy się na jego podstawie obiekt HikariDataSource. Zwykle wykonuje się to raz podczas uruchamiania aplikacji i współdzieli utworzone źródło.
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
public class Main {
public static void main(String[] args) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:postgresql://localhost:5432/shop");
config.setUsername("app");
config.setPassword("secret");
config.setMaximumPoolSize(10);
HikariDataSource ds = new HikariDataSource(config);
System.out.println("Pool ready, max size " + config.getMaximumPoolSize());
ds.close();
}
}Pobieranie połączenia
Aby pobrać połączenie, należy wywołać ds.getConnection(). Jak zwykle należy umieścić je w try-with-resources.
Kluczowa kwestia jest następująca: zamknięcie połączenia z puli nie zamyka fizycznego gniazda — zwraca połączenie do puli, aby można było użyć go ponownie.
import com.zaxxer.hikari.HikariDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
public class Main {
public static void main(String[] args) {
DataSource ds = new HikariDataSource();
try (Connection conn = ds.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT count(*) FROM users");
ResultSet rs = ps.executeQuery()) {
if (rs.next()) System.out.println("Users: " + rs.getInt(1));
} catch (SQLException e) {
System.out.println(e.getMessage());
}
}
}close() oznacza zwrot
To często zaskakuje wielu programistów. W przypadku puli:
conn.close()zwraca połączenie do puli.- Pula utrzymuje rzeczywiste gniazdo otwarte dla kolejnego użytkownika.
Należy więc nadal zawsze zamykać połączenia — try-with-resources jest poprawnym rozwiązaniem. Połączenie jest zwracane, a nie niszczone.
Dobieranie rozmiaru puli
Większa pula nie zawsze jest lepsza. Zbyt duża pula przeciąża bazę danych nadmiarem równoczesnych operacji.
Zgodnie z zaleceniami HikariCP mała pula, często o rozmiarze około (core_count * 2) + effective_spindle_count, zwykle sprawdza się lepiej niż ogromna. maximumPoolSize określa limit, a minimumIdle utrzymuje kilka gotowych połączeń w stanie bezczynności.
public class Main {
public static void main(String[] args) {
int cores = 4;
int spindles = 1; // SSD-ish
int recommended = (cores * 2) + spindles;
System.out.println("Suggested max pool size: " + recommended);
}
}Najważniejsze limity czasu
HikariCP udostępnia limity czasu, które chronią aplikację przed zablokowaną bazą danych:
connectionTimeout— jak długo trwa oczekiwanie na pobranie połączenia przed zgłoszeniem błędu (domyślnie 30 s).idleTimeout— jak długo nieużywane połączenie pozostaje w puli.maxLifetime— po jakim czasie połączenie jest wycofywane (wartość należy ustawić poniżej limitu czasu samej bazy danych).
Weryfikacja połączeń
Sieci mogą po cichu zrywać połączenia. Przed przekazaniem połączenia HikariCP może sprawdzić jego poprawność.
Nowoczesne sterowniki JDBC używają Connection.isValid(timeout), a HikariCP wywołuje tę metodę automatycznie. Można też ustawić connectionTestQuery w przypadku starszych sterowników, które nie obsługują isValid.
Wykrywanie wycieków
Wyciek połączenia występuje, gdy kod pobiera połączenie, ale nigdy go nie zamyka — w końcu pula się wyczerpuje, a każda próba pobrania kończy się przekroczeniem czasu oczekiwania.
Należy ustawić leakDetectionThreshold (np. 20000 ms), aby HikariCP zapisywał ślad stosu każdego połączenia przetrzymywanego dłużej niż określony czas i wskazywał bezpośrednio kod będący przyczyną problemu.
Jedna pula na aplikację
Obiekt HikariDataSource należy utworzyć raz i używać ponownie przez cały czas działania aplikacji.
Tworzenie nowej puli dla każdego żądania niweczy cały sens tego rozwiązania — za każdym razem ponoszony byłby koszt inicjalizacji. Pulę należy zamknąć dopiero podczas zamykania aplikacji za pomocą ds.close().
Monitorowanie puli
HikariCP udostępnia metryki czasu działania, dzięki którym można obserwować stan puli.
- Liczba aktywnych, bezczynnych i wszystkich połączeń.
- Wątki aktualnie oczekujące na połączenie.
HikariCP integruje się z Micrometer, Dropwizard Metrics i JMX. Stale wysoka liczba wątków „awaiting” oznacza, że pula jest zbyt mała albo połączenia są przetrzymywane zbyt długo.
Szybkie sprawdzenie
Co dzieje się po wywołaniu close() na pobranym połączeniu podczas korzystania z HikariCP?
Podsumowanie
HikariCP zapewnia wydajne ponowne wykorzystywanie połączeń:
- Należy skonfigurować obiekt
HikariDataSourceraz podczas uruchamiania aplikacji. - Połączenie należy pobierać za pomocą
getConnection()w try-with-resources;close()zwraca je do puli. - Wartość
maximumPoolSizenależy utrzymywać na umiarkowanym poziomie. - Należy dostroić
connectionTimeout,maxLifetimei weryfikację połączeń. - Należy używać
leakDetectionThresholddo wykrywania niezwróconych połączeń.
Ucz się Java dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 104
- Lekcje
- 374
Często zadawane pytania
Czy lekcja „Pula połączeń z HikariCP” jest bezpłatna?
Tak — pełny tekst „Pula połączeń z HikariCP” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Pula połączeń z HikariCP”?
Wydajne ponowne wykorzystywanie połączeń Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Java Academy?
Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Pula połączeń z HikariCP”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?
Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy JDBC
- PreparedStatement
- Transakcje
- Pula połączeń z HikariCP