首页>代码>springboot2 aop注解配置多个数据库并实现多数据源动态切换和数据库读写分离>/read-write-splitting/src/main/java/cn/jsxwsl/www/config/datasource/MutiDataSource.java
package cn.jsxwsl.www.config.datasource;

import cn.jsxwsl.www.nums.DBTypeEnum;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.lang.Nullable;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author 佚名
 * @Date 2020/3/25 18:26
 */
@Configuration
@EnableTransactionManagement
public class MutiDataSource {

    /**
     * Spring boot提供了AbstractRoutingDataSource
     * 根据用户定义的规则选择当前的数据源,
     * 这样我们可以在执行查询之前,设置使用的数据源。
     * 实现可动态路由的数据源,在每次数据库查询操作前执行。
     * 它的抽象方法 determineCurrentLookupKey() 决定使用哪个数据源。
     */
    static class MyRoutingDataSource extends AbstractRoutingDataSource {
        @Nullable
        @Override
        protected Object determineCurrentLookupKey() {
            // 从当前线程获取到数据源的key
            return DataSourceTheadLocal.get();
        }
    }

    /**
     * 数据源 master
     *
     * @return DataSource
     */
    @Bean
    @ConfigurationProperties("spring.datasource.master")
    public DataSource masterDataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 数据源 slave1
     *
     * @return DataSource
     */
    @Bean
    @ConfigurationProperties("spring.datasource.slave1")
    public DataSource slave1DataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 数据源 slave2
     *
     * @return DataSource
     */
    @Bean
    @ConfigurationProperties("spring.datasource.slave2")
    public DataSource slave2DataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public DataSource myRoutingDataSource(DataSource masterDataSource,
                                          DataSource slave1DataSource,
                                          DataSource slave2DataSource) {
        Map<Object, Object> targetDataSources = new HashMap<>();
        targetDataSources.put(DBTypeEnum.MASTER, masterDataSource);
        targetDataSources.put(DBTypeEnum.SLAVE1, slave1DataSource);
        targetDataSources.put(DBTypeEnum.SLAVE2, slave2DataSource);
        MyRoutingDataSource myRoutingDataSource = new MyRoutingDataSource();
        myRoutingDataSource.setDefaultTargetDataSource(masterDataSource);
        myRoutingDataSource.setTargetDataSources(targetDataSources);
        return myRoutingDataSource;
    }

    /**
     * 配置事务
     *
     * @param myRoutingDataSource DataSource
     * @return PlatformTransactionManager
     */
    @Bean
    public PlatformTransactionManager transactionManager(DataSource myRoutingDataSource) {
        return new DataSourceTransactionManager(myRoutingDataSource);
    }


    /**
     * mybatis
     * @param myRoutingDataSource DataSource
     * @return SqlSessionFactory
     * @throws Exception Exception
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource myRoutingDataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(myRoutingDataSource);
//        sqlSessionFactoryBean.setMapperLocations(
//                new PathMatchingResourcePatternResolver()
//                        .getResources("classpath:mapper/*.xml")
//        );
        return sqlSessionFactoryBean.getObject();
    }


}


最近下载更多
lironggang  LV38 2023年7月11日
HANCW  LV8 2023年3月12日
1529860026  LV24 2022年10月18日
1234mama  LV19 2022年4月11日
fellowfun  LV12 2021年8月12日
mudingc木钉  LV30 2021年6月16日
annazhang  LV29 2021年6月11日
pxqtsht  LV15 2021年5月16日
xhmpmail  LV17 2021年2月22日
听说过  LV17 2021年1月4日
最近浏览更多
1358849392  LV21 1月22日
漫步的海星  LV4 2023年9月21日
lironggang  LV38 2023年7月11日
HANCW  LV8 2023年3月12日
xiahaoyu  LV8 2023年2月25日
xp95323  LV14 2022年9月21日
绘飛的渔 2022年8月2日
暂无贡献等级
fangen0005  LV25 2022年4月17日
zhang6332 2022年4月6日
暂无贡献等级
1214066599  LV8 2022年4月4日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友