In dem Fall habe ich erlebt Da wir ein System mit unterschiedlichen Datenquellen und derselben Tabellendefinition erstellt haben, Wir werden das Know-how zu diesem Zeitpunkt teilen.
Der Treiber verwendet "Oracle", aber bitte ändern Sie es entsprechend Ihrer Umgebung.
application.yml
spring:
datasource:
#Datenquelle A.
alpha:
jdbc-url: jdbc:oracle:thin:@localhost:1521/XEPDB1
username: sample_a
password: sample_a
driverClassName: oracle.jdbc.OracleDriver
#Datenquelle 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);
//Dynamischer Wechsel der Datenquelle
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("Mapper-XML-Pfad");
factoryBean.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return factoryBean.getObject();
}
// ...Kürzung
}
①: Legen Sie einen Alias für die häufig verwendete Mapper-Klasse fest (2): AutoConfigure ist für Multi-Datenquellen deaktiviert. Stellen Sie es daher manuell ein.
Definieren Sie einen Partitionswert, um die Referenzdatenquelle zu bestimmen.
public enum DataSourceType {
ALPHA, BETA
}
Der Teilungswert wird für jeden Thread gehalten.
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();
}
}
Erfassen Sie den Klassifizierungswert zur Bestimmung der Referenzdatenquelle. Aus der in DataSourceConfig.dynamicDataSource festgelegten Datenquelle mit diesem Indikatorwert Bestimmen Sie die Datenquelle, auf die tatsächlich verwiesen werden soll.
DynamicRoutingDataSourceResolver.java
public class DynamicRoutingDataSourceResolver extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDataSourceType();
}
}
Lassen Sie uns den DataSourceType über den DataSourceContextHolder festlegen. Wenn Sie es als Querschnittsprozess definieren möchten, verwenden Sie AOP usw., um die Datenquelle zu wechseln.
DataSourceContextHolder.setDataSourceType(DataSourceType.ALPHA);