在我们的项目中涉及到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
public static String getTargetDataSource(){
return dbName.get();
}
public static void changeDB(String name){
dbName.set(name);
}
//清除数据源
public static void clearDB(){
dbName.remove();
}
}
数据源枚举类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();
}
}
@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.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=
........