java编码之——通过切面 实现动态切换数据源 mysql & oracle(配置多数据源)

完成动态切换双数据源有些时间了,刚刚又接入了第三个数据源,顺便把这块的逻辑梳理、记录、分享一下;

交代下项目环境:springboot2.0.1, mybatis3,jdk1.8,druid 1.1.0

下面主要是贴代码了,并配以简单说明,从配置文件说起:(druid 的配置就不贴了)

建立一个DataSourceConfig类,主要加载配置文件中的数据库信息及连接池信息,并实例化DataSource对象和

给出一个示例:

// -----------------------------------------mysql config-------------------------------------@Value("${spring.datasource.mysql.url}")
private String mysqlUrl;

@Value("${spring.datasource.mysql.finedb.url}")
private String finedbUrl;

@Value("${spring.datasource.mysql.username}")
private String username;

@Value("${spring.datasource.mysql.password}")
private String password;

@Value("${spring.datasource.mysql.driverClassName}")
private String driverClassName;
// -----------------------------------------mysql config-------------------------------------
@Bean(name="dataSourceMysql")
public DataSource dataSourceMysql(){
    System.out.println("----------------加载mysql" + mysqlUrl);

    DruidDataSource datasource = new DruidDataSource();
    datasource.setUrl(mysqlUrl);
    datasource.setUsername(username);
    datasource.setPassword(password);
    datasource.setDriverClassName(driverClassName);
    setDruidOptions(datasource); // 设置druid数据源的属性

    return datasource;
}
private void setDruidOptions(DruidDataSource datasource){

    datasource.setInitialSize(initialSize);
    datasource.setMinIdle(minIdle);
    datasource.setMaxActive(maxActive);
    datasource.setMaxWait(maxWait);
    datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
    datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
    datasource.setPoolPreparedStatements(poolPreparedStatements);
    datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
    datasource.setKeepAlive(true);
    datasource.setTestWhileIdle(testWhileIdle);
    datasource.setTestOnBorrow(testOnBorrow);
    datasource.setTestOnReturn(testOnReturn);
    datasource.setPoolPreparedStatements(poolPreparedStatements);

    try {
        datasource.setFilters(filters);
    } catch (SQLException e) {
        log.error("druid configuration initialization filter Exception", e);
    }
}
@Bean(name = "dynamicDataSource")  //将三个数据源装起来
    @Primary
    public DataSource dataSource(){

        DynamicDataSource dynamicDataSource = DynamicDataSource.getInstance(); //私有化构造了  不能直接new
        DataSource mysql = dataSourceMysql();
//        DataSource finedb = dataSourceFinedb();
//        DataSource oracle = dataSourceOracle();

        //设置默认数据源
        dynamicDataSource.setDefaultTargetDataSource(mysql);

        //配置多个数据源
        Map<Object,Object> map = new HashMap<>();
        map.put(DataSourceTypeEnum.Mysql.getName(),mysql);
//        map.put(DataSourceTypeEnum.Oracle.getName(),oracle);
//        map.put(DataSourceTypeEnum.FineDB.getName(),finedb);
        dynamicDataSource.setTargetDataSources(map);

        return dynamicDataSource;
    }

接着就说到了DynamicDataSource类,理解为放三个数据源的容器,新建类并继承AbstractRoutingDataSource并重写其方法:

标题

截图吧,自己跟着敲一敲  有好处,哈哈!

接着说到JdbcContextHolder这个类,作用获取和设置当前线程用到的数据源,建立:

标题

另外需要设置SqlSessionFactory:

标题

上面还有一个枚举类:

标题

下面这个类DataSourceAopInService 就是执行切面切换数据源了(* 在service层决定数据源):

标题

后面字体变小了,不然一个图截不下,哈哈!

然后就可以在service层使用注解动态切换数据源了,示例如:

注意:没有注解默认使用mysql的数据源:

好了,以上就是实操代码,欢迎各位参考或给出宝贵意见!喜欢的话可以点赞或转发!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值