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.
- no use el
DataSourceBuilder
y en su lugar crear unorg.apache.tomcat.jdbc.pool.DataSource
. Esto creará el grupo y configurará las conexiones.
Si necesitas
Hikari
oDbcp2
reemplazar el contenido del métodocreatePooledDataSource()
abajo, con elHikari
oDbcp2
secciones de configuración de la fuente original de Spring DataSourceConfiguration.java. El contenido mostrado decreatePooledDataSource()
a continuación fueron robados delTomcat.dataSource()
en el archivo vinculado. - Agrega un
tomcat
sección de configuración bajo cada de tu tudatasource
configuraciones en suapplication.yml
- 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 elapplication.yml
y no losconfig-name-here.datasource
sin.tomcat
- Agregue beans para proporcionar configuraciones de
DataSourceProperties
para cada una de las fuentes de datos - 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;
- 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 comoHikari
como dependencia y configurespring.datasource.*
parámetros Spring creará y configurará único puesta en comúnDataSource
que se puede conectar automáticamente en su código. - 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 enspring-boot-autoconfugire
módulo: Primavera comienzaDataSource
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 propioBean
para cada conexión de base de datos agrupada. La primavera notará tuDataSource
y no creará un grupo internamente. Aquí hay un ejemplo. - 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.