在Spring Boot中配置多数据源&使用动态数据源

配置文件方式,这里使用YMAL,你也可以使用传统的Properties,只要将:更换为.的形式即可。

spring:
  datasource:
    one:
      setype: com.alibaba.druid.pool.DruidDataSource
      url: 你的JDBC URL
      username: 你的用户名
      password: 你的密码
      driver-class-name: com.mysql.jdbc.Driver
    two:
      setype: com.alibaba.druid.pool.DruidDataSource
      url: 你的JDBC URL
      username: 你的用户名
      password: 你的密码
      driver-class-name: com.mysql.jdbc.Driver

创建DynamicDataSource

public class DynamicDataSource extends AbstractRoutingDataSource {  
  @Override    
  protected Object determineCurrentLookupKey() {       
     return DataSourceContextHolder.getType();    
    }
}

创建DataSourceContextHolder 类并使用ThreadLocal来存放数据源类型变量

public class DataSourceContextHolder {
    private static final Logger LOGGER = LoggerFactory.getLogger(ProductContextHolder.class);
    public static final List<Object> supportList= new ArrayList<>();
    // 线程本地环境
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
    public static void setType(String type) {
        contextHolder.set(type);
        LOGGER.debug("==============切换数据源,类型:" + type + "================");
    }
    public static String getType() {
        return (contextHolder.get());
    }
    public static void clear() {
        contextHolder.remove();
    }
    public static boolean support(String type) {
        return supportList.contains(type);
    }
}

创建一个Configurer来配置数据源,这里仅配置两个作为参考,如果你看过 使用Spring配置动态数据源实现读写分离 的话,你会觉得这非常简单,只不过是XML配置方式 =》 编程配置方式的转化。
有趣的是如果你要使用非默认数据源,如Druid,数据源配置项datasource.setype.com.alibaba.druid.pool.DruidDataSource并不能很好工作,只能使用DataSourceBuilder的时候显式指定,至少在Spring Boot 1.4是这样。

@Configuration
public class DataSourceConfigurer {

    @Bean
    @Primary
    @ConfigurationProperties(prefix="spring.datasource.one")
    public DataSource oneDataSource() {
        return DataSourceBuilder
                .create()
                .type(DruidDataSource.class)
                .build();
    }

    @Bean
    @ConfigurationProperties(prefix="spring.datasource.two")
    public DataSource twoDataSource() {
        return DataSourceBuilder
                .create()
                .type(DruidDataSource.class)
                .build();
    }
    @Bean
    public DynamicDataSource dataSource(){
        DynamicDataSource dynamicDataSource = new DynamicDataSource();
        Map<Object, Object> targetDataSources = Maps.newHashMap();
        targetDataSources.put("one", oneDataSource());
        targetDataSources.put("two", twoDataSource());
        dynamicDataSource.setTargetDataSources(targetDataSources);

        DataSourceContextHolder.supportList.addAll(targetDataSources.keySet());

        return dynamicDataSource;
    }
}

好了,动态数据源配置完成,至于在什么时候切换数据源根据你的实际情况而定,方式有很多,比如使用注解、做切面、用拦截器拦截参数等等,这里就不做赘述了。在使用void DataSourceContextHolder.setType(String type)切换数据源前最好能调用boolean DataSourceContextHolder.support(String type)判断是否支持该数据源。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,828评论 19 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,118评论 6 342
  • application的配置属性。 这些属性是否生效取决于对应的组件是否声明为Spring应用程序上下文里的Bea...
    新签名阅读 10,778评论 1 27
  • 这些属性是否生效取决于对应的组件是否声明为 Spring 应用程序上下文里的 Bean(基本是自动配置的),为一个...
    发光的鱼阅读 5,269评论 0 14
  • 我独自一人走在大街上,心里面满满的,不知道是什么东西.这个夜,似乎与众不同,周围充满了诡异的气息. 虽说是在初冬,...
    小蚂蚁小蚂蚁阅读 3,736评论 0 1

友情链接更多精彩内容