Saltar al contenido

¿Cómo configurar múltiples grupos de conexiones cuando se usan múltiples fuentes de datos en Spring Boot?

Al fin después de tanto luchar pudimos dar con el arreglo de esta cuestión que muchos usuarios de nuestro sitio presentan. Si tienes algún dato que compartir no dudes en aportar tu conocimiento.

Solución:

Este es el enfoque que tuve que tomar para obtener grupos separados para cada fuente de datos. La siguiente es una implementación de los puntos que @user3007501 hizo anteriormente.

  1. no use el DataSourceBuildery en su lugar crear un org.apache.tomcat.jdbc.pool.DataSource. Esto creará el grupo y configurará las conexiones.

    Si necesitas Hikari o Dbcp2 reemplazar el contenido del método createPooledDataSource() abajo, con el Hikari o Dbcp2 secciones de configuración de la fuente original de Spring DataSourceConfiguration.java. El contenido mostrado de createPooledDataSource() a continuación fueron robados del Tomcat.dataSource() en el archivo vinculado.

  2. Agrega un tomcat sección de configuración bajo cada de tu tu datasource configuraciones en su application.yml
  3. Asegúrese de que cada uno de sus beans de configuración esté utilizando el config-name-here.datasource.tomcat (nota la .tomcat) propiedad especificada en el application.yml y no los config-name-here.datasource sin .tomcat
  4. Agregue beans para proporcionar configuraciones de DataSourceProperties para cada una de las fuentes de datos
  5. utilizar @Qualifier("name of bean from previous step") en su fuente de datos de sondeo de Tomcat

aplicación.yml

# Primary Datasource
spring:
  datasource:
    username: your-username-for-ds-1
    password: your-password-for-ds-1
    driver-class-name: net.sourceforge.jtds.jdbc.Driver
    tomcat:
      validation-query: select 1
      test-on-borrow: true


myotherdatasource:
  datasource:
    username: your-username-for-ds-2
    password: your-password-for-ds-2
    driver-class-name: net.sourceforge.jtds.jdbc.Driver
    # HERE: make sure you have a tomcat config for your second datasource like below 
    tomcat:
      validation-query: select 1
      test-on-borrow: true

MyCustomDatasourceConfig.java <- su archivo de configuración personalizado

los createPooledDataSource() fue tomado de DataSourceConfiguration.java en la fuente del proyecto Spring.

import org.apache.tomcat.jdbc.pool.DataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DatabaseDriver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.beans.factory.annotation.Qualifier;


@Configuration
public class MyCustomDatasourceConfig 
    @Bean(name = "My-First-Data")
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource.tomcat") 
    // *** NOTE the inclusion of the .tomcat above
    public DataSource primaryDataSource(DataSourceProperties properties) 
        return createPooledDataSource(properties);
    


    @Bean()
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSourceProperties dataSourcePropsPrimary() 
        return new DataSourceProperties();
    


    @Bean(name = "My-Second-Data-Source")
    @ConfigurationProperties(prefix = "myotherdatasource.datasource.tomcat") 
    // *** NOTE the inclusion of the .tomcat above
    public DataSource datasourceOtherConfig(@Qualifier("secondary_ds_prop") DataSourceProperties properties) 
        return createPooledDataSource(properties);
    

    @Bean(name  = "secondary_ds_prop")
    @ConfigurationProperties(prefix = "myotherdatasource.datasource")
    public DataSourceProperties dataSourcePropsSecondary() 
        return new DataSourceProperties();
    


    private DataSource createPooledDataSource(DataSourceProperties properties) 
        // Using fully qualified path to the tomcat datasource just to be explicit for the sake of this example
        DataSource dataSource = (org.apache.tomcat.jdbc.pool.DataSource)
                   properties.initializeDataSourceBuilder()
                   .type(org.apache.tomcat.jdbc.pool.DataSource.class).build();
        DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl());
        String validationQuery = databaseDriver.getValidationQuery();
        if (validationQuery != null) 
            dataSource.setTestOnBorrow(true);
            dataSource.setValidationQuery(validationQuery);
        
        return dataSource;
    


  1. Generalmente, DataSource La interfaz se implementa mediante la agrupación de bibliotecas para que sea compatible con los marcos y el código JavaEE como fuente de conexión JDBC universal que en realidad funciona con el controlador DB.
    La configuración automática de SpringBoot tiene inicializadores DataSource para bibliotecas de agrupación populares. Lista completa que puede encontrar en las fuentes de Spring.
    Eso significa que todo lo que necesita para aprovechar la agrupación en su proyecto es agregar una biblioteca de agrupación como Hikari como dependencia y configure spring.datasource.* parámetros Spring creará y configurará único puesta en común DataSource que se puede conectar automáticamente en su código.
  2. Otra historia si necesitas crear más de una DataSource. Uso intensivo de la configuración automática de SpringBoot @ConditionalOnMissingBean anotación para determinar los casos en los que se puede aplicar el comportamiento predeterminado. Spring no puede crear dos fuentes de datos predeterminadas porque es ambiguo cuál debe usarse.
    Puedes encontrar esto en spring-boot-autoconfugire módulo: Primavera comienza DataSource lógica de inicialización solo si no hay un bean de este tipo en contexto.
    Para usar varios pools tienes que definir el tuyo propio Bean para cada conexión de base de datos agrupada. La primavera notará tu DataSource y no creará un grupo internamente. Aquí hay un ejemplo.
  3. Puede encontrar más detalles sobre DataSource configuración automática aquí

Si te ha resultado de utilidad nuestro post, agradeceríamos que lo compartas con el resto programadores de esta forma nos ayudas a dar difusión a nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *