天天看點

淺談MyBatis-Plus的多資料源配置

作者:小亮叨叨叨

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.完成,現在可以在多個資料源之間進行快速切換。

繼續閱讀