Spring动态切换数据库以mybatis为例,hibernate同理(java配置 非xml)

10 篇文章 0 订阅
9 篇文章 0 订阅

动态切换数据库

1.配置数据源名常量

public class DSConst {
    public static final String LOCAL="localibdata";
    public static final String REMOTE="remoteibdata";
}

2.数据源配置及多数据源映射关系

@Bean(name = "remote2")
    public DataSource dataSource2(){
        HashMap<Object,Object> targetDataSources = new HashMap<>();//配置目标数据源
        targetDataSources.put(DSConst.LOCAL, dataSource3());
        targetDataSources.put(DSConst.REMOTE, dataSource4());
        RoutingDS routingDS = new RoutingDS();
        routingDS.setTargetDataSources(targetDataSources);
        routingDS.setDefaultTargetDataSource(dataSource3());//配置默认数据源
        return routingDS;
    }
    
    //配置数据源1
    @Bean(name = "localibdata")
    public DataSource dataSource3(){
        PooledDataSource dataSource = new PooledDataSource();
        dataSource.setUrl(url);
        dataSource.setDriver(driverClassName);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

//配置数据源2
    @Bean(name = "remoteibdata")
    public DataSource dataSource4(){
        PooledDataSource dataSource = new PooledDataSource();
        dataSource.setUrl(url2);
        dataSource.setDriver(driverClassName2);
        dataSource.setUsername(username2);
        dataSource.setPassword(password2);
        return dataSource;
    }

3.配置sessionfactory(此例子为mybatis)注入数据源(此例子是注入remote2数据源)

@Resource(name="remote2")
    private DataSource dataSource2;
    
    //配置SqlSessionFactory,主要提供数据源和mapper配置文件
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(){
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource2);
        factoryBean.setTypeAliasesPackage("com.hooah.entity");        //为实体类去别名
        return factoryBean;
    }

4.建立动态数据源,注意,这个类必须继承AbstractRoutingDataSource,且实现方法determineCurrentLookupKey,该方法一般返回字符串

public class RoutingDS extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        // TODO Auto-generated method stub
        return DataSourceContextHolder.getDataSourceType();
    }

}

5.最后,如何切换呢?

调用方法DataSourceContextHolder的setDataSourceType方法即可,例:

DataSourceContextHolder.setDataSourceType(DataSourceConst.TEST); 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值