MyBatis-Plus是一個優秀的ORM架構,提供了友善的多資料源配置方法。
以下是配置方法:
1.在application.yml中添加多個資料源的配置資訊。
spring:
datasource:
# 主資料源配置
master:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_master?useSSL=false
username: root
password: root
# 從資料源配置
slave:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_slave?useSSL=false
username: root
password: root
2.建立多個資料源的bean對象。
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
}
3.配置資料源路由政策。
在這裡,我們使用MyBatis-Plus提供的DynamicDataSource類來進行資料源路由。
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
@Autowired
private DataSource masterDataSource;
@Autowired
private DataSource slaveDataSource;
@Bean
public DataSource dynamicDataSource() {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>();
dataSourceMap.put(DataSourceType.MASTER.name(), masterDataSource);
dataSourceMap.put(DataSourceType.SLAVE.name(), slaveDataSource);
dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
dynamicDataSource.setTargetDataSources(dataSourceMap);
return dynamicDataSource;
}
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
sessionFactory.setDataSource(dynamicDataSource());
Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*.xml");
sessionFactory.setMapperLocations(resources);
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setSqlInjector(new LogicSqlInjector());
sessionFactory.setGlobalConfig(globalConfig);
return sessionFactory.getObject();
}
}
這裡的DynamicDataSource類是:
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSourceType();
}
}
public enum DataSourceType {
MASTER, SLAVE;
}
public class DynamicDataSourceContextHolder {
private static final ThreadLocal<DataSourceType> CONTEXT_HOLDER = new ThreadLocal<>();
public static void setDataSourceType(DataSourceType dataSourceType) {
CONTEXT_HOLDER.set(dataSourceType);
}
public static DataSourceType getDataSourceType() {
return CONTEXT_HOLDER.get();
}
public static void clearDataSourceType() {
CONTEXT_HOLDER.remove();
}
}
4.實作資料源切換。
對于需要通路從資料源的方法,隻需要在調用前設定資料源類型,如下所示:
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE);
對于通路主資料源的方法,不需要設定資料源類型,預設為主資料源。
5.完成,現在可以在多個資料源之間進行快速切換。