SpringBoot中的双数据源切换

在我们的项目中涉及到Oracle,Mysql数据库切换;

数据放在了Oracle上,而配置和权限管理放在了Mysql上;所以经常要在两者之间切换。

数据源切换总共有三种方法:

    1  在任何地方切换。

        例如我们的项目:DBContext.changeDB(DBName.IMS.getKey())  //切换Oracle

        DBContext.changeDB(DBName.DBVS.getKey())                          //切换Mysql

    2  在方法上加注解。

        例如:@DBAspect("dbvs")  //切换Mysql

                   @DBAspect("ims")  //切换Oracle

   3 在dao层之间分开,一个mapper文件专门去访问Mysql,一个专门访问Oracle

 

接下来我们主要将第一种:在任何地方切换(我们项目代码无法拷贝,纯手敲)

类DBContext

public class DBContext {

    private static ThreadLocal dbName = new ThreadLocal<>();

    public static String getTargetDataSource(){

       return dbName.get(); 

   }

    public static void changeDB(String name){

        dbName.set(name);

    }

    //清除数据源

    public static void clearDB(){

        dbName.remove();

    }

    

}

SpringBoot中的双数据源切换_第1张图片

数据源枚举类DBName

public enum DBName {

    DBVS("dbvs"),

    IMS("ims");

    private String key;

    DBName(String key){

        this.key = key;

    }

    public String getKey(){

    return key;

    }

   public void setKey(String key){

       this.key  = key;

   }

}

DynamicDataSource类继承AbstractRoutingDataSource

    public class DynamicDataSource extends AbstractRoutingDataSource{

    protected Object determineCurrentLookupKey(){

    return DBContext.getRargetDataSource();

    }

    }

SpringBoot中的双数据源切换_第2张图片配置类ContextConfig

@SpringBootConfiguration

@ComponentScan(basePackages = {"com.dbvs.*"})

@MapperScan(basePackages = {"com.dbvs.*.dao"})

@EnableTransactionManagement

@EnableAsync

Public class ContextConfig {

    @ConfigurationProperties(prefix = "spring.datasource.druid.dbvs")

    @Bean("dbvs.mysql")

    @Qualifier("dbvs.mysql")'

    public DataSource mysqlDataSource()  throws Exception{

        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();

        dataSource.setUsername(userName);//userName,password 配置在核心配置文件中

        dataSource.setPassword(password);

       }

    return dataSource;

}

@ConfigurationProperties(prefix = "spring.datasource.druid.ims")

    @Bean("ims.oracle")

    @Qualifier("ims.oracle")'

    public DataSource oracleDataSource()  throws Exception{

        DruidDataSource dataSource = DruidDataSourceBuilder.create().build();

        dataSource.setUsername(userName);//userName,password 配置在核心配置文件中

        dataSource.setPassword(password);

       }

    return dataSource;

}

@Bean("dynamicDataSource")

@Qualifier("dynamicDataSource")

@Primary

public DataSource dynamicDataSource() throws Exception{

    DynamicDataSource dataSource = new DynamicDataSource();

   HashMap targetDataSource = new HashMap<>();

   targetDataSource.put(DBName.DBVS.getKey(),mysqlDataSource());

   targetDataSource.put(DBName.IMS.getKey(),oracleDataSource());

   dataSource.setTargetDataSources(targetDataSource);

   dataSource.setDefaultTargetDataSource(targetDataSource.get(DBName.DBVS.getKey()));

   return dataSource;

}

}

dataSource的拦截器

public class DataSourceInterceptor implements HandlerInterceptor{

    public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception{

        DBContext.clearDB();

        DBContext.changeDB(DBName.DBVS.getKey());

        return HandlerInterceptor.super.preHandle(request,response,handler);

    }

}

 

总拦截器类

@SpringBootConfiguration

public class InterceptorConfig implements WebMvConfigurer {

//拦截器配置,与业务相关,有着强烈的前后依赖顺序

//其他拦截器在datasourceInterceptor之前添加

public void addInterceptors(InterceptorRegistry registry){

    WebMvcConfigurer.super.addInterceptors(registry);

   // registry.addInterceptor(其他拦截器,例如:日志,权限);

      registry.addInterceptor(datasourceInterceptor);

}

@Bean("datasourceInterceptor")

public DatasourceInterceptor datasourceInterceptor(){

DatasourceInterceptor  interceptor = new DatasourceInterceptor ();

return interceptor;

}

}

 

配置文件

#-----------datasource-------mysql------------

spring.datasource.druid.dbvs.url=

spring.datasource.druid.dbvs.driver-class-name=

spring.datasource.druid.dbvs.username=

spring.datasource.druid.dbvs.password=

......

#-----------------datasource-------oracle-----

spring.datasource.druid.dbvs.url=

spring.datasource.druid.ims.driver-class-name=

spring.datasource.druid.ims.username=

spring.datasource.druid.ims.password=

........

 

 

 

 

你可能感兴趣的:(SpringBoot中的双数据源切换)