Dans le cas où j'ai vécu Puisque nous avons construit un système utilisant différentes sources de données et la même définition de table, Nous partagerons le savoir-faire à ce moment-là.
Le pilote utilise "Oracle", mais veuillez le modifier en fonction de votre environnement.
application.yml
spring:
  datasource:
    #Source de données A
    alpha:
      jdbc-url: jdbc:oracle:thin:@localhost:1521/XEPDB1
      username: sample_a
      password: sample_a
      driverClassName: oracle.jdbc.OracleDriver
    #Source de données B
    beta:
      jdbc-url: jdbc:oracle:thin:@localhost:1521/XEPDB1
      username: sample_b
      password: sample_b
      driverClassName: oracle.jdbc.OracleDriver
DataSourceConfig.java
package com.example;
@Configuration
@MapperScan(basePackages = { "com.example.mapper" }, sqlSessionTemplateRef = "sqlSessionTemplate") // ①
public class DataSourceConfig {
    @Bean(name = "alphaDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.alpha")
    public DataSource alphaDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean(name = "betaDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.beta")
    public DataSource betaDataSource() {
        return DataSourceBuilder.create().build();
    }
    @Bean("dynamicDataSource")
    public DynamicRoutingDataSourceResolver dynamicDataSource(@Qualifier("alphaDataSource") DataSource alphaDataSource, @Qualifier("betaDataSource") DataSource betaDataSource) {
        Map<Object, Object> targetDataSources = new HashMap<Object, Object>();
        targetDataSources.put(DataSourceType.ALPHA, alphaDataSource);
        targetDataSources.put(DataSourceType.BETA, betaDataSource);
        //Changement dynamique de source de données
        DynamicRoutingDataSourceResolver resolver = new DynamicRoutingDataSourceResolver();
        resolver.setTargetDataSources(targetDataSources);
        resolver.setDefaultTargetDataSource(alphaDataSource);
        return resolver;
    }
    @Bean
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource") DynamicRoutingDataSourceResolver resolver) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        // ②
        factoryBean.setDataSource(resolver);
        factoryBean.setMapperLocations("Chemin XML du mappeur");
        factoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return factoryBean.getObject();
    }
    // ...réduction
}
①: Définissez un alias pour la classe Mapper couramment utilisée (2): la configuration automatique est désactivée pour les sources multi-données, donc définissez-la manuellement.
Définissez une valeur de partition pour déterminer la source de données de référence.
public enum DataSourceType {
    ALPHA, BETA
}
La valeur de division est conservée pour chaque thread.
DataSourceContextHolder.java
public class DataSourceContextHolder {
    private static ThreadLocal<DataSourceType> contextHolder = new ThreadLocal<DataSourceType>();
    public static void setDataSourceType(DataSourceType dataSourceType) {
        contextHolder.set(dataSourceType);
    }
    public static DataSourceType getDataSourceType() {
        return contextHolder.get();
    }
    public static void clear() {
        contextHolder.remove();
    }
}
Acquérir la valeur de classification pour déterminer la source de données de référence. À partir de l'ensemble de sources de données dans DataSourceConfig.dynamicDataSource avec cette valeur d'indicateur Déterminez la source de données à laquelle se référer réellement.
DynamicRoutingDataSourceResolver.java
public class DynamicRoutingDataSourceResolver extends AbstractRoutingDataSource {
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDataSourceType();
    }
}
Définissons le DataSourceType via le DataSourceContextHolder. Si vous souhaitez le définir comme un processus transversal, utilisez AOP, etc. pour changer de source de données.
DataSourceContextHolder.setDataSourceType(DataSourceType.ALPHA);
        Recommended Posts