SpringBoot中使用AbstractRoutingDataSource

本文目的是爲了讓你快速在Springboot中使用多數據庫切換,並非研究類型文章~

本文說的方法也是使用AbstractRoutingDataSource,因此和SpringMVC中使用需要的類完全一樣,僅僅是配置略有不同。閱讀本文之前請先參考
https://blog.csdn.net/lizhengwei1989/article/details/88081703
瞭解使用過程中自定義的類

下面假設自定義的類已經有了,接下來的配置如下:

使用到了另一篇文章中一樣的類有:

DataSourceContextHolder
DataSourceKey
DynamicDataSource
DynamicDataSourceAspect
TargetDataSource

你可以直接拷貝使用

不一樣的改動有
首先,你的啓動類上的配置

//指定aop事務執行順序,已保證在切換數據源的後面
@EnableTransactionManagement(order = 2)
//排除數據源自動配置
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class ToolApplication {

	public static void main(String[] args) {
		SpringApplication.run(ToolApplication.class, args);
	}

}

其次,新增了一個類,這個類和前面提到的5個類放一起就好了

package com.ifeng.tool.dynamic;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DynamicDataSourceConfiguration {

    @Primary
    @Bean(name = "clickhouseDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.clickhouse")
    public DataSource masterDataSource() {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        dataSource.setName("clickhouseDataSource");
        return dataSource;
    }

    @Bean(name = "brandDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.brand")
    public DataSource slaveDataSource() {
        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
        dataSource.setName("brandDataSource");
        return dataSource;
    }

    /**
     * 動態數據源: 通過AOP在不同數據源之間動態切換
     * @return
     */
    @Bean(name = "dynamicDataSource")
    public DataSource dataSource(@Autowired @Qualifier("clickhouseDataSource") DataSource primery,@Autowired @Qualifier("brandDataSource") DataSource brand) {
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        // 默認數據源
        dynamicDataSource.setDefaultTargetDataSource(primery);

        // 配置多數據源
        Map<Object, Object> dsMap = new HashMap<Object, Object>();
        dsMap.put("clickhouse", primery);
        dsMap.put("brand", brand);
        dynamicDataSource.setTargetDataSources(dsMap);
        return dynamicDataSource;
    }

    @Bean
    public PlatformTransactionManager txManager(DataSource dynamicDataSource) {
        return new DataSourceTransactionManager(dynamicDataSource);
    }

    @Bean("sqlSessionFactory")
    @ConfigurationProperties(prefix = "mybatis")
    public SqlSessionFactoryBean sqlSessionFactoryBean(@Autowired @Qualifier("dynamicDataSource") DataSource dynamicDataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dynamicDataSource);
        return sqlSessionFactoryBean;
    }

    @Bean
    @ConfigurationProperties(prefix = "mybatis")
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("com.testxxxx.tool");
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
        return mapperScannerConfigurer;
    }

}

對應的數據庫配置是

spring.datasource.clickhouse.driver-class-name:ru.yandex.clickhouse.ClickHouseDriver
spring.datasource.clickhouse.url:jdbc:clickhouse://xxxxxxxx/ods
spring.datasource.clickhouse.username:
spring.datasource.clickhouse.password:

spring.datasource.brand.driver-class-name:com.mysql.jdbc.Driver
spring.datasource.brand.url:jdbc:mysql://xxxxxxx/ibs
spring.datasource.brand.username:xxxxx
spring.datasource.brand.password:xxxxxxx

配置就夠了,實測切換沒有問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章