Pool de Conexiones

Como ya sabéis Java Database Connectivity (JDBC) es una API que proporciona una interfaz común para acceder a bases de datos relacionales desde Java. JDBC utiliza un conjunto de clases e interfaces para conectarse a una base de datos, enviar consultas y recuperar resultados. Pero hasta ahora usabamos/ocupabámos una conexión del SGBD. Las conexiones de un SGBD son limitadas, por tanto hay formas de conectarse a la base de datos de manera más eficiente.

Pool de Conexiones

El uso de un pool de conexiones JDBC puede mejorar el rendimiento de una aplicación Java que requiere conectarse a una base de datos. En lugar de abrir y cerrar una conexión cada vez que se necesita acceder a la base de datos, el pool de conexiones permite reutilizar las conexiones existentes.

Lo primero que es necesario es agregar tres jars de Apache a tu proyecto (de la misma manera que el jar de MariaDB) para poder usar esta forma nueva de conectarse:

Para crear un pool básico de conexiones se crea un objeto de la clase BasicDataSource, a partir de ese objeto se obteniene las conexiones necesitadas. Y se le asigna todos los parámetros necesarios:

public class EjemploPoolConexionJDBC {

    public static void main(String[] args) throws SQLException {
        // Configurar el pool de conexiones
        BasicDataSource dataSource = new BasicDataSource();
        //dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/hola");
        dataSource.setUsername("xxx");
        dataSource.setPassword("xxxx");
        dataSource.setInitialSize(5);
        dataSource.setMaxTotal(10);
        
        // Obtener una conexión del pool
        Connection conn = dataSource.getConnection();
        
        // Usar la conexión para enviar consultas
        // ...
        
        // Devolver la conexión al pool
        conn.close();
    }
}

Hay más opciones de pool con diferentes clases DataSource, y también podemos configurarlo con determinados sets del DataSource tal como véis en el ejemplo. Extra:

  • setMaxActive() : Número máximo de conexiones que se pueden abrir simultáneamente.
  • setMinIdle() : Número mínimo de conexiones inactivas que queremos que haya. Si el número de conexiones baja de este número, se abriran más.
  • setMaxIdle() : Número máximo de conexiones inactivas que queremos que haya. Si hay más, se irán cerrando.
  • setInitialSize() : Número de conexiones que se quiere que se abran en cuanto el pool comienza a trabajar (se llama por primera vez a getConnection(), setLogwriter(), setLoginTimeout(), getLoginTimeout() o getLogWriter(). Debe llamarse a setInitialSize() antes de llamar a cualquiera de estos métodos y después no puede cambiarse el valor.