springboot 多数据源配置

摘要:
1.配置类importcom.aliaba.druid.spring.boot.autoconfigure。DruidDataSourceBuilder;importorg.springframework.boot.context.properties。配置属性;importorg.springframework.context.annotation.Bea

1、配置类

import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

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

/**
 * 配置多数据源
 */
@Configuration
public class DynamicDataSourceConfig {

  @Bean
  @ConfigurationProperties("spring.datasource.druid.report")
  public DataSource reportDataSource() {
    return DruidDataSourceBuilder.create().build();
  }
  
  @Bean
  @ConfigurationProperties("spring.datasource.druid.etlengine-v4")
  public DataSource etlengineV4DataSource() {
      return DruidDataSourceBuilder.create().build();
  }
  

  @Bean
  @Primary
  public DynamicDataSource dataSource(DataSource reportDataSource, DataSource etlengineV4DataSource) {
    Map<Object, Object> targetDataSources = new HashMap<>();
    targetDataSources.put(DataSourceNames.REPORT, reportDataSource);
    targetDataSources.put(DataSourceNames.ETLENGINE_V4, etlengineV4DataSource);
    return new DynamicDataSource(reportDataSource, targetDataSources);
  }
}

2、动态数据源

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

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

/**
 * 动态数据源
 */
public class DynamicDataSource extends AbstractRoutingDataSource {
  private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

  public DynamicDataSource(DataSource defaultTargetDataSource,
      Map<Object, Object> targetDataSources) {
    super.setDefaultTargetDataSource(defaultTargetDataSource);
    super.setTargetDataSources(targetDataSources);
    super.afterPropertiesSet();
  }

  @Override
  protected Object determineCurrentLookupKey() {
    return getDataSource();
  }

  public static void setDataSource(String dataSource) {
    contextHolder.set(dataSource);
  }

  public static String getDataSource() {
    return contextHolder.get();
  }

  public static void clearDataSource() {
    contextHolder.remove();
  }

}

3、自定义一个注解,并通过aop自定义切面去动态注入不同的数据源

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
  String name() default "";
}
@Aspect
@Component
public class DataSourceAspect implements PriorityOrdered {
  protected Logger logger = LoggerFactory.getLogger(getClass());

  @Pointcut("@annotation(com.patrick.datasources.annotation.DataSource)")
  public void dataSourcePointCut() {

  }

  @Around("dataSourcePointCut()")
  public Object around(ProceedingJoinPoint point) throws Throwable {
    MethodSignature signature = (MethodSignature) point.getSignature();
    Method method = signature.getMethod();

    DataSource ds = method.getAnnotation(DataSource.class);
    if (ds == null) {
      DynamicDataSource.setDataSource(DataSourceNames.REPORT);
      logger.debug("set datasource is " + DataSourceNames.REPORT);
    } else {
      DynamicDataSource.setDataSource(ds.name());
      logger.debug("set datasource is " + ds.name());
    }

    try {
      return point.proceed();
    } finally {
      DynamicDataSource.clearDataSource();
      logger.debug("clean datasource");
    }
  }

  @Override
  public int getOrder() {
    return 1;
  }
}

免责声明:文章转载自《springboot 多数据源配置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据分页技术(学习笔记)MySQL实现over partition by(分组后对组内数据排序)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

SVN查看项目修改记录及修改内容

工具/原材料svn I,查看修改记录1,选择要查看的文件夹,打开后在空白处单击鼠标右键。3当然,有时我们想查看单个文件的记录。同样的原则适用于此文件。右键单击以选择“查看日志”。SVN查看所有日志提交记录1。默认情况下,SVN显示上周的文件提交和修改记录。如何查看更长时间的日志记录?...

利用adb实时查看应用日志

出现乱码解决办法:就是通过chcp命令改变代码页,UTF-8的代码页为65001,输入命令:,执行该操作后,代码页就被变成UTF-8了。...

故障排查:vsftpd无法用浏览器访问

CentOS6上设置的ftp服务器突然无法使用浏览器访问,但可以使用xftp等工具正常访问。据推测,阿里云的安全组设置之前已经过修改,这可能与1)修改vsftpd的配置,在被动模式下手动指定一个随机连接端口,并添加以下内容:passv_min_port=50000pasv_max_port=60000 02)如果只打开端口20和21,设置阿里云安全组控制端口...

Oracle11g温习-第七章:redo日志

thread:线程,在单实例的环境下,thread#永远是1sequence:日志序列号。在日志切换时会递增。FIRST_CHANGE#:在当前日志中记录的首个数据块的scn。...

Python-正则

,三:量词*重复0次或多次{0,}+重复一次或多次{1,}?重复0或1次{1,0}{n}重复n次{n}{n,}重复n次,或更多次{n,m}将n次重复到m次Escape:如果字符串中有特殊字符要匹配,请在常规字符和字符串前面添加r。如果特殊字符在字符组中,则它们是匹配的特殊字符,但为了记忆,匹配时会转义所有特殊字符。...

VMware虚拟机几个常用文件夹介绍

将在虚拟机系统文件下自动生成三个锁文件。虚拟系统正常关闭后,VMware将解锁,“systemTyep.vmdk.lck”和“systemType.vmem”文件夹将消失。当RAM运行缓慢时,它会将数据从RAM移动到一个称为“分页文件”的空间。...