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