0Pricing
Java Academy · Lección

Agrupación de conexiones con HikariCP

Reutilización eficiente de conexiones

Agrupación de conexiones con HikariCP es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

¿Por qué usar un pool de conexiones?

Abrir una conexión de base de datos es costoso: el establecimiento de la conexión TCP, la autenticación y la configuración de la sesión pueden tardar decenas de milisegundos.

Un pool de conexiones mantiene listo un conjunto de conexiones abiertas. Su código toma una prestada, la utiliza y la devuelve, convirtiendo una apertura costosa en una obtención rápida.

Conozca HikariCP

HikariCP es el estándar de facto para pools en Java. Es pequeño, rápido y el valor predeterminado en Spring Boot.

Implementa javax.sql.DataSource, por lo que el resto de su código JDBC permanece igual: simplemente obtiene las conexiones del pool en lugar de DriverManager.

Configuración del pool

HikariCP se configura con un objeto HikariConfig: la URL de JDBC, las credenciales y el tamaño del pool.

A continuación, se crea un HikariDataSource a partir de él. Normalmente esto se hace una sola vez al iniciar la aplicación y se comparte.

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

Obtener una conexión

Llame a ds.getConnection() para obtener una conexión. Como de costumbre, inclúyala en un bloque try-with-resources.

Esta es la idea clave: cerrar una conexión del pool no cierra el socket físico, sino que devuelve la conexión al pool para reutilizarla.

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() significa devolverla

Esto confunde a muchos desarrolladores. Con un pool:

  • conn.close() devuelve la conexión al pool.
  • El pool mantiene abierto el socket real para el siguiente usuario.

Por lo tanto, debe cerrarla siempre; try-with-resources es lo correcto. La está devolviendo, no destruyendo.

Tamaño del pool

Más grande no significa mejor. Un pool demasiado grande sobrecarga la base de datos con trabajo simultáneo.

La recomendación de HikariCP es que un pool pequeño, a menudo de alrededor de (core_count * 2) + effective_spindle_count, suele superar a uno enorme. maximumPoolSize establece el límite; minimumIdle mantiene algunas conexiones preparadas.

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

Tiempos de espera clave

HikariCP ofrece tiempos de espera que protegen la aplicación frente a una base de datos bloqueada:

  • connectionTimeout — cuánto tiempo espera una obtención antes de fallar (30 s de forma predeterminada).
  • idleTimeout — cuánto tiempo permanece abierta una conexión inactiva.
  • maxLifetime — retira una conexión cuando alcanza esta antigüedad (manténgalo por debajo del tiempo de espera de la propia base de datos).

Validación de conexiones

Las redes pueden interrumpir las conexiones sin avisar. HikariCP puede validar una conexión antes de entregarla.

Los controladores JDBC modernos utilizan Connection.isValid(timeout); HikariCP lo llama automáticamente. También puede establecer connectionTestQuery para controladores antiguos que no disponen de isValid.

Detección de fugas

Se produce una fuga de conexión cuando el código obtiene una conexión pero nunca la cierra; con el tiempo, el pool se agota y todas las solicitudes terminan agotando el tiempo de espera.

Establezca leakDetectionThreshold (por ejemplo, 20000 ms) y HikariCP registrará un seguimiento de pila para cualquier conexión que se mantenga durante más tiempo, señalando directamente el código responsable.

Un pool por aplicación

Cree el HikariDataSource una sola vez y reutilícelo durante toda la vida de la aplicación.

Crear un pool nuevo para cada solicitud anula su propósito, ya que pagaría el coste de inicio cada vez. Cierre el pool únicamente al apagar la aplicación con ds.close().

Supervisión del pool

HikariCP expone métricas en tiempo de ejecución para que pueda supervisar el estado del pool.

  • Conexiones activas, inactivas y totales.
  • Hilos que actualmente esperan una conexión.

Se integra con Micrometer, Dropwizard Metrics y JMX. Un número de 'en espera' persistentemente alto significa que el pool es demasiado pequeño o que las conexiones se mantienen ocupadas durante demasiado tiempo.

Comprobación rápida

Al utilizar HikariCP, ¿qué ocurre al llamar a close() en una conexión obtenida?

Repaso

HikariCP hace eficiente la reutilización de conexiones:

  • Configure un HikariDataSource una sola vez al iniciar la aplicación.
  • Obtenga la conexión con getConnection() dentro de try-with-resources; close() la devuelve al pool.
  • Mantenga maximumPoolSize en un valor moderado.
  • Ajuste connectionTimeout, maxLifetime y la validación.
  • Utilice leakDetectionThreshold para detectar conexiones no devueltas.

Preguntas frecuentes

¿La lección «Agrupación de conexiones con HikariCP» es gratis?

Sí — el texto completo de «Agrupación de conexiones con HikariCP» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Agrupación de conexiones con HikariCP»?

Reutilización eficiente de conexiones Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Agrupación de conexiones con HikariCP»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Fundamentos de JDBC
  2. PreparedStatement
  3. Transacciones
  4. Agrupación de conexiones con HikariCP
← Volver a Java Academy