• Spring扩展多数据源DynamicDataSource切换


    原理:执行SQL的时候会拿到数据源,AbstractRoutingDataSource类系统预留了接口,可以根据需求来拿到对应的数据源。
     
    一、配置多数据源
    @Configuration
    public class DataSourceProxyConfig {
    
    
        @Bean("originOrder")
        @ConfigurationProperties(prefix = "spring.datasource.order")
        public DataSource dataSourceMaster() {
            return new DruidDataSource();
        }
    
    
        @Bean("originStorage")
        @ConfigurationProperties(prefix = "spring.datasource.storage")
        public DataSource dataSourceStorage() {
            return new DruidDataSource();
        }
    
    
        @Bean("originPay")
        @ConfigurationProperties(prefix = "spring.datasource.pay")
        public DataSource dataSourcePay() {
            return new DruidDataSource();
        }
    
    
        @Bean(name = "order")
        public DataSourceProxy masterDataSourceProxy(@Qualifier("originOrder") DataSource dataSource) {
            return new DataSourceProxy(dataSource);
        }
    
    
        @Bean(name = "storage")
        public DataSourceProxy storageDataSourceProxy(@Qualifier("originStorage") DataSource dataSource) {
            return new DataSourceProxy(dataSource);
        }
    
    
        @Bean(name = "pay")
        public DataSourceProxy payDataSourceProxy(@Qualifier("originPay") DataSource dataSource) {
            return new DataSourceProxy(dataSource);
        }
    
    
        @Bean("dynamicDataSource")
        public DataSource dynamicDataSource(@Qualifier("order") DataSource dataSourceOrder,
                                            @Qualifier("storage") DataSource dataSourceStorage,
                                            @Qualifier("pay") DataSource dataSourcePay) {
    
    
            DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
    
    
            Map<Object, Object> dataSourceMap = new HashMap<>(3);
            dataSourceMap.put(DataSourceKey.ORDER.name(), dataSourceOrder);
            dataSourceMap.put(DataSourceKey.STORAGE.name(), dataSourceStorage);
            dataSourceMap.put(DataSourceKey.PAY.name(), dataSourcePay);
    
    
            dynamicRoutingDataSource.setDefaultTargetDataSource(dataSourceOrder);
            dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
    
    
            DynamicDataSourceContextHolder.getDataSourceKeys().addAll(dataSourceMap.keySet());
    
    
            return dynamicRoutingDataSource;
        }
    
    
        @Bean
        @ConfigurationProperties(prefix = "mybatis")
        public SqlSessionFactoryBean sqlSessionFactoryBean(@Qualifier("dynamicDataSource") DataSource dataSource) {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
            sqlSessionFactoryBean.setDataSource(dataSource);
            return sqlSessionFactoryBean;
        }
    
    
    }
    View Code
    二、配置SqlSessionFactoryBean - 如上
     
    三、实现自定义的DynamicRoutingDataSource
    @Slf4j
    public class DynamicRoutingDataSource extends AbstractRoutingDataSource {
    
    
        @Override
        protected Object determineCurrentLookupKey() {
            log.info("当前数据源 [{}]", DynamicDataSourceContextHolder.getDataSourceKey());
            return DynamicDataSourceContextHolder.getDataSourceKey();
        }
    }
    View Code

     四、如何使用

    需要与数据库交互前设置对应的数据源的key
    DynamicDataSourceContextHolder.setDataSourceKey(DataSourceKey.ORDER);
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    闲来无事研究研究.Net中的异步编程
    Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理
    c# 连接Redis报错:WRONGTYPE Operation against a key holding the wrong kind of value:类型搞混弄出的错误
    VS2013 调试时出现“表达式计算器中发生内部错误”的问题解决办法
    WCF优化的几个常规思路
    UWP汉堡菜单
    C#注册系统全局快捷键
    CXF详细介绍
    hadoop默认3个核心配置文件说明
    在虚拟机配置hive
  • 原文地址:https://www.cnblogs.com/lean-blog/p/14150993.html
Copyright © 2020-2023  润新知