Recent comments

Pool de Conexiones JDBC


Tuneando pool de conexiones en spring boot:
 
Validar autocommit = true

spring.datasource.hikari.connection-timeout = 20000
spring.datasource.hikari.minimum-idle= 10
spring.datasource.hikari.maximum-pool-size= 20
spring.datasource.hikari.idle-timeout=10000
spring.datasource.hikari.max-lifetime= 1000
#spring.datasource.hikari.auto-commit =true
Que es un pool de conexiones?



En una aplicación empresarial será necesario utilizar muchas conexiones, y crear una nueva conexión tiene un impacto en recursos bastante alto, por lo que lo más conveniente es manejar el concepto de pool de conexiones. 

Un pool de conexiones nos permite agilizar el proceso de obtener una conexión por cada clase Java que necesita de una conexión, ya que el objetivo del pool de conexiones precisamente es tener listas varias conexiones a la base de datos, de manera que sea mucho más eficiente el proceso de obtener y liberar una conexión a base de datos. 

De hecho el proceso de administración de una conexión se delega al pool de conexiones, por lo que podemos dejar de preocuparnos por abrir y cerrar una conexión, ya que de este tipo de tareas, entre otras, se encargará el pool de conexiones. 

Un pool de conexiones puede crearse de varias maneras, una es directamente por código Java que nosotros desarrollemos, sin embargo, deberemos mantener nosotros mismos este código. Otra manera es utilizar algún proyecto, como el proyecto de jdbc de apache.

Otra manera es apoyándonos del servidor de aplicaciones Java, como puede ser Tomcat, Glassfish, JBoss, etc, y estos servidores serán los encargados de ayudarnos a administrar el pool de conexiones


Ejemplo de Pool de Conexiones Usando Apache:

Agregamos la dependencia de apache y los drivers (En este caso solo se usara mysql)

Estructura Final del proyecto




Pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mx</groupId>
<artifactId>PoolDeConexiones</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>8.0</version>
</dependency>

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.36</version>
    </dependency>

    
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-dbcp2</artifactId>
        <version>2.1.1</version>
    </dependency>

</dependencies>
</project>

PoolConexionesMySql registrando driver y asignado a data source de apache


package capadatos.pool;

import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;

public class PoolConexionesMySql {

public static DataSource getDataSource() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUsername("root");
ds.setPassword("admin");
ds.setUrl("jdbc:mysql://localhost:3306/sga?useSSL=false");
//Definimos el tamano del pool de conexiones
ds.setInitialSize(5);//5 Conexiones iniciales
return ds;
}
public static Connection getConexion() throws SQLException{
return getDataSource().getConnection();
}
}

Probando el pool de conexiones:

package poolconexiones;

import capadatos.pool.PoolConexionesMySql;
import capadatos.pool.PoolConexionesOracle;
import java.sql.*;

public class TestPoolConexiones {

public static void main(String[] args) {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
try {
//Probamos el pool de MySql
//y ejecutamos una consulta
conn = PoolConexionesMySql.getConexion();
System.out.println("Utilizamos el pool de conexiones de MySql");
stmt = conn.prepareStatement("SELECT * FROM persona");
rs = stmt.executeQuery();
while(rs.next()){
System.out.print(" " + rs.getInt(1));//id_persona
System.out.print(" " + rs.getString(2));//nombre
System.out.println(" " + rs.getString(3));//apellido
}
//Cerramos la conexion para regresarla al pool
conn.close();
//Probamos el pool de Oracle
//y ejecutamos una consulta
/*conn = PoolConexionesOracle.getConexion();
System.out.println("Utilizamos el pool de conexiones de Oracle");
stmt = conn.prepareStatement("SELECT * FROM employees WHERE employee_id in(100,101,102)");
rs = stmt.executeQuery();
while(rs.next()){
System.out.print(" " + rs.getInt(1));//empleado_id
System.out.print(" " + rs.getString(2));//nombre
System.out.println(" " + rs.getString(3));//apellido
}
//Cerramos la conexion para regresarla al pool
conn.close();*/
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}


Proyecto Completo



No hay comentarios.