0Pricing
Java Academy · Lektion

Connection Pooling mit HikariCP

Verbindungen effizient wiederverwenden

Connection Pooling mit HikariCP ist eine kostenlose Java Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Java Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Warum Connection-Pooling?

Das Öffnen einer Datenbankverbindung ist teuer: TCP-Handshake, Authentifizierung und Sitzungseinrichtung können mehrere Dutzend Millisekunden dauern.

Ein Connection-Pool hält eine Reihe geöffneter Verbindungen bereit. Ihr Code leiht sich eine aus, verwendet sie und gibt sie zurück — aus einem teuren Öffnen wird so ein kostengünstiges Ausleihen.

HikariCP kennenlernen

HikariCP ist der De-facto-Standard für Connection-Pools in Java. Es ist klein, schnell und der Standard in Spring Boot.

HikariCP implementiert javax.sql.DataSource, sodass der übrige JDBC-Code unverändert bleibt — Sie beziehen die Verbindungen lediglich aus dem Pool statt über DriverManager.

Den Pool konfigurieren

Sie konfigurieren HikariCP mit einem HikariConfig-Objekt: der JDBC-URL, den Zugangsdaten und der Poolgröße.

Anschließend erstellen Sie daraus eine HikariDataSource. Das geschieht normalerweise einmal beim Anwendungsstart; anschließend wird sie gemeinsam verwendet.

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();
    }
}

Eine Verbindung ausleihen

Rufen Sie zum Ausleihen ds.getConnection() auf. Umschließen Sie den Aufruf wie gewohnt mit try-with-resources.

Die entscheidende Erkenntnis: Das Schließen einer Verbindung aus dem Pool schließt nicht den physischen Socket — es gibt die Verbindung zur Wiederverwendung an den Pool zurück.

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() bedeutet Zurückgeben

Das führt bei vielen Entwicklern zu Verwirrung. Bei einem Pool gilt:

  • conn.close() gibt die Verbindung an den Pool zurück.
  • Der Pool hält den tatsächlichen Socket für den nächsten Nutzer geöffnet.

Sie sollten die Verbindung also weiterhin immer schließen — try-with-resources ist korrekt. Sie geben sie zurück, statt sie zu zerstören.

Poolgröße festlegen

Größer ist nicht besser. Ein zu großer Pool überlastet die Datenbank durch zu viele gleichzeitige Vorgänge.

Die Empfehlung von HikariCP lautet: Ein kleiner Pool, häufig etwa (core_count * 2) + effective_spindle_count, ist normalerweise besser als ein riesiger. maximumPoolSize legt die Obergrenze fest; minimumIdle hält einige Verbindungen warm.

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);
    }
}

Wichtige Timeouts

HikariCP bietet Timeouts, die Ihre Anwendung vor einer blockierten Datenbank schützen:

  • connectionTimeout — wie lange beim Ausleihen gewartet wird, bevor der Vorgang fehlschlägt (Standard: 30 s).
  • idleTimeout — wie lange eine inaktive Verbindung bestehen bleibt.
  • maxLifetime — nach welcher Lebensdauer eine Verbindung ausgemustert wird (legen Sie den Wert niedriger als den eigenen Timeout der Datenbank fest).

Verbindungen validieren

Netzwerkverbindungen können unbemerkt abbrechen. Bevor HikariCP eine Verbindung ausgibt, kann es diese validieren.

Moderne JDBC-Treiber verwenden Connection.isValid(timeout); HikariCP ruft die Methode automatisch auf. Für alte Treiber ohne isValid können Sie auch connectionTestQuery festlegen.

Leaks erkennen

Ein Connection-Leak entsteht, wenn Code eine Verbindung ausleiht, aber nie schließt — schließlich ist der Pool erschöpft und jedes weitere Ausleihen läuft in einen Timeout.

Setzen Sie leakDetectionThreshold (z. B. 20000 ms). HikariCP protokolliert dann für jede Verbindung, die länger als diesen Zeitraum gehalten wird, einen Stacktrace und weist Sie direkt auf den fehlerhaften Code hin.

Ein Pool pro Anwendung

Erstellen Sie die HikariDataSource einmal und verwenden Sie sie während der gesamten Lebensdauer der Anwendung wieder.

Wenn Sie für jede Anfrage einen neuen Pool erstellen, verfehlen Sie den Zweck — Sie würden jedes Mal die Kosten des Starts bezahlen. Schließen Sie den Pool erst beim Herunterfahren mit ds.close().

Den Pool überwachen

HikariCP stellt Laufzeitmetriken bereit, mit denen Sie den Zustand des Pools überwachen können.

  • Aktive, inaktive und gesamte Verbindungen.
  • Threads, die derzeit auf eine Verbindung warten.

HikariCP lässt sich in Micrometer, Dropwizard Metrics und JMX integrieren. Eine dauerhaft hohe Anzahl wartender Threads bedeutet, dass der Pool zu klein ist oder Verbindungen zu lange gehalten werden.

Kurztest

Was bewirkt der Aufruf von close() für eine ausgeliehene Verbindung bei Verwendung von HikariCP?

Zusammenfassung

HikariCP macht die Wiederverwendung von Verbindungen effizient:

  • Konfigurieren Sie eine HikariDataSource einmal beim Anwendungsstart.
  • Leihen Sie Verbindungen mit getConnection() in try-with-resources aus; close() gibt sie an den Pool zurück.
  • Halten Sie maximumPoolSize moderat.
  • Passen Sie connectionTimeout, maxLifetime und die Validierung an.
  • Verwenden Sie leakDetectionThreshold, um nicht zurückgegebene Verbindungen zu erkennen.

Häufig gestellte Fragen

Ist die Lektion „Connection Pooling mit HikariCP“ kostenlos?

Ja — der vollständige Text von „Connection Pooling mit HikariCP“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Java Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Java Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Connection Pooling mit HikariCP“?

Verbindungen effizient wiederverwenden Du übst Java Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Java Academy zu starten?

Keine Vorkenntnisse erforderlich. Java Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Connection Pooling mit HikariCP“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Java Academy-Lektion Code schreiben und ausführen?

Ja. Jede Java Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. JDBC-Grundlagen
  2. PreparedStatement
  3. Transaktionen
  4. Connection Pooling mit HikariCP
← Zurück zu Java Academy