本文目的是爲了讓你快速在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
配置就夠了,實測切換沒有問題