zoukankan      html  css  js  c++  java
  • 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);
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    深入admin之chang_list
    List<T>列表通用过滤模块设计
    Mysql行转换为列
    Linux中cp直接覆盖不提示的方法
    hibernate Restrictions 用法
    java.lang.OutOfMemoryError: PermGen space
    ruby+gem常用命令
    Linux查看CPU和内存使用情况
    在Ubuntu 9.04下配置Apache和ModPython
    有关查询和执行计划的DMV 从而明确那些SQL要优化
  • 原文地址:https://www.cnblogs.com/lean-blog/p/14150993.html
Copyright © 2011-2022 走看看