Springboot+Druid配置多数据源

这篇具有很好参考价值的文章主要介绍了Springboot+Druid配置多数据源。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Druid数据库多数据源

Spring的多数据源支持—AbstractRoutingDataSource,AbstractRoutingDataSource定义了抽象的determineCurrentLookupKey方法,子类实现此方法,来确定要使用的数据源

Druid 实现多数据源支持,核心是Overwrite AbstractRoutingDataSource 的 determineCurrentLookupKey 方法

public abstract class AbstractRoutingDataSource extends AbstractDataSource implements InitializingBean {
	 protected DataSource determineTargetDataSource() {
		Assert.notNull(this.resolvedDataSources, "DataSource router not initialized");
		Object lookupKey = determineCurrentLookupKey();
		DataSource dataSource = this.resolvedDataSources.get(lookupKey);
		if (dataSource == null && (this.lenientFallback || lookupKey == null)) {
			dataSource = this.resolvedDefaultDataSource;
		}
		if (dataSource == null) {
			throw new IllegalStateException("Cannot determine target DataSource for 	             lookup key [" + lookupKey + "]");
		}
		return dataSource;
	}

        // 确定当前要使用的数据源
        protected abstract Object determineCurrentLookupKey();
}

配置多数据源

以springboot框架为基础使用aop注解的方式依赖Druid配置多数据源

1.添加依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	
		<!-- aop注解实现aspectjweaver依赖 -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.9.6</version>
		</dependency>
		<!-- mybatis-spring-boot-starter -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.3</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>8.0.28</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.2.8</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.12</version>
			<scope>provided</scope>
		</dependency>

2.配置Druid属性

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    first:
      url: jdbc:mysql://localhost:3306/***?useUnicode=true&characterEncoding=utf-                  8&serverTimezone=UTC
      username: root
      password: *****
    second:
      enable: true
      url: jdbc:mysql://localhost:3306/***?useUnicode=true&characterEncoding=utf-                 8&serverTimezone=UTC
      username: root
      password: *****
    druid:
      # 初始连接数
      initialSize: 5
      # 最小连接池数量
      minIdle: 10
      # 最大连接池数量
      maxActive: 20
      # 配置获取连接等待超时的时间
      maxWait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      minEvictableIdleTimeMillis: 300000
      # 配置一个连接在池中最大生存的时间,单位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # 配置检测连接是否有效
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # 控制台管理用户名和密码
        login-username: admin
        login-password: 123456
      #配置监控统计拦截的filters:stat:监控统计、self4j(使用log4j的记得导入log4j的依赖):日志记录、          wall:防御sql注入 此处配置不能遗漏服务sql监控台不能监控sql
      filters: stat,wall,log4j2
      filter:
        stat:
          enabled: true
          # 慢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          enabled: true
          config:
            multi-statement-allow: true

3.配置动态数据源

继承AbstractRoutingDataSource重写determineCurrentLookupKey()方法


/**
 * 动态数据源
 */
public class DynamicDatesource extends AbstractRoutingDataSource {

    public DynamicDatesource(DataSource dataSource,HashMap<Object, Object> map){
        super.setDefaultTargetDataSource(dataSource);
        super.setTargetDataSources(map);
        super.afterPropertiesSet();
    }

    /**
     * 获取key指定数据源
     * @return
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return DynamicDateSourceCut.getLocal();
    }
}

配置数据源

//配置数据源
@Configuration
public class DruidConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.first")
    public DataSource firstDataSource(DruidSourceProperties druidSourceProperties){

        return druidSourceProperties.dataSource(new DruidDataSourceWrapper());
    }
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.second")
    @ConditionalOnProperty(prefix ="spring.datasource.second",name ="enable",havingValue = "true")
    public DataSource secondDataSource(DruidSourceProperties druidSourceProperties){
        return druidSourceProperties.dataSource(new DruidDataSourceWrapper());
    }
    @Bean
    @Primary//在多数据源的时候,使用@Primary注解用于指定其中一个作为主数据源
    public DynamicDatesource setDymaicDatesource(DataSource firstDataSource){
        HashMap<Object, Object> map = new HashMap<>();
        map.put(DateSourceType.FIRST.name(),firstDataSource);
        setDataSource(map,DateSourceType.SECOND.name(),"secondDataSource");
        return new DynamicDatesource(firstDataSource,map);
    }
    /**
     * 设置数据源
     *
     * @param targetDataSources 备选数据源集合
     * @param sourceName 数据源名称
     * @param beanName bean名称
     */
    public void setDataSource(Map<Object, Object> targetDataSources, String sourceName, 		String beanName){
        try {
            DataSource dataSource = SpringUtils.getBean(beanName);
            targetDataSources.put(sourceName, dataSource);
        } catch (Exception e){

        }
    }
}

4.配置数据源切换

package com.example.springboot.data;
/**
*数据源切换 保存每个数据源指定的lookupKey
*/
public class DynamicDateSourceCut {
    /**
     * 使用ThreadLocal维护变量,ThreadLocal为每个使用该变量的线程提供独立的变量副本,
     *  所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
     */

    private static ThreadLocal<String> threadLocal=new ThreadLocal<>();

    /**
     * 设置数据源的变量
     */
    public static void setLocal(String local){
        threadLocal.set(local);

    }
    /**
     * 获得数据源的变量
     */
    public static String getLocal(){
        return threadLocal.get();

    }
    /**
     * 清空数据源变量
     */
    public static void clearLocl() {
        threadLocal.remove();
    }
}

5.定义aop切面实现

/**
 * 定义数据源切面
 */
@Aspect
@Component
public class DateSourceAspect {

    private static final Logger log= LoggerFactory.getLogger(DateSourceAspect.class);

    /**
     * 定义切点  使用注解
     * @within类注解
     * @annotation方法注解
     */
    @Pointcut("@annotation(com.example.springboot.aspect.DateSource)"+
             "||@within(com.example.springboot.aspect.DateSource)")
    public void PintCut(){

    }
    /**
     * 通知使用环绕的通知方法
     */
    @Around("PintCut()")
    public Object ResovePoint(ProceedingJoinPoint point) throws Throwable {
        //获取注解
        DateSource dateSource = getDateSource(point);
        if (dateSource!=null){
            DynamicDateSourceCut.setLocal(dateSource.value().name());
        }
        try {
            //执行方法
           return point.proceed();
        } finally {
            // 销毁数据源 在执行方法之后
            DynamicDateSourceCut.clearLocl();
        }

    }

    /**
     * 获取注解
     */
    protected DateSource getDateSource(ProceedingJoinPoint point){
        MethodSignature signature = (MethodSignature) point.getSignature();
        //获取方法或方法类型上的注解
        DateSource annotation;
        //获取class类型上注解
        annotation=AnnotationUtils.findAnnotation(signature.getDeclaringType(),DateSource.class);
        if (annotation==null){
            annotation = AnnotationUtils.findAnnotation(signature.getMethod(), DateSource.class);
        }
        return annotation;
    }
}

定义的注解和注解值文章来源地址https://www.toymoban.com/news/detail-515391.html


/**
 * 定义注解
 */
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DateSource {
    DateSourceType value()default DateSourceType.FIRST;
}


/**
*使用枚举定义注解的值
*/

public enum DateSourceType {
    //默认数据库
    FIRST,
    SECOND;
}

到了这里,关于Springboot+Druid配置多数据源的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot整合Druid配置多数据源

    目录 1.初始化项目 1.1.初始化工程 1.2.添加依赖 1.3.配置yml文件 1.4.Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹 1.5.配置使用数据源 1.5.1.注解方式 1.5.2.基于AOP手动实现多数据源原生的方式 2.结果展示 Mybatis-Plus:简介 | MyBatis-Plus (baomidou.com) 在正式开始之前,先初始

    2024年02月01日
    浏览(51)
  • springboot整合druid及多数据源配置

    本篇主要分两部分 ①springboot整合druid的代码配置,以及druid的监控页面演示;②对实际场景中多数据源的配置使用进行讲解。 可以用idea快速生成一个可运行的demo工程,具体可以参考如何快速创建springboot项目 主要用到的依赖如下:  配置数据库需要的配置文件application.yml( 注

    2024年02月12日
    浏览(45)
  • springboot实现多数据源配置(Druid/Hikari)

    使用springboot+mybatis-plus+(Druid/Hikari)实现多数据源配置 操作步骤: 引入相应的maven坐标 编写mybatis配置,集成mybatis或mybatis-plus(如果已集成可跳过) 编写数据源配置类 编写注解,并通过aop进行增强(编写数据源切换代码) 类或方法中使用注解,对数据源进行切换 第一步:

    2024年02月13日
    浏览(50)
  • springboot配置自定义数据源(Druid德鲁伊)的步骤。

    今天和大家分享下在Springboot中配置自定义数据源Druid的两种方法及步骤。 方法一: 1.在pom.xml配置依赖(注释里面的内容) 2.配置自己的数据源设置,我是在yaml文件中配置的,顺便提醒一下,在配置yaml文件的时候缩进问题一定要注意,不然无法读取到就会报错。 spring: datasourc

    2024年02月15日
    浏览(56)
  • SpringBoot整合Mybatis-Plus、Druid配置多数据源

    目录 1.初始化项目 1.1.初始化工程 1.2.添加依赖 1.3.配置yml文件 1.4.Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹 1.5.配置使用数据源 1.5.1.注解方式 1.5.2.基于AOP手动实现多数据源原生的方式 2.结果展示 Mybatis-Plus:简介 | MyBatis-Plus (baomidou.com) 在正式开始之前,先初始

    2024年02月11日
    浏览(46)
  • Dynamic DataSource 多数据源配置【 Springboot + DataSource + MyBatis Plus + Druid】

    MybatisPlus多数据源配置主要解决的是多数据库连接和切换的问题。在一些大型应用中,由于数据量的增长或者业务模块的增多,可能需要访问多个数据库。这时,就需要配置多个数据源。 2.1.1、引用依赖 2.1.2、application.yml 配置 2.1.3、通用配置类 2.1.4、使用方式 这里便不过多的

    2024年02月03日
    浏览(46)
  • JAVA:Springboot动态装配Druid多数据源

    1、简介 最近打算搭建一个鉴权中心服务,采用springboot+FastMybatis装配Druid,考虑后续拓展采用Druid多数据源配置,以一个数据源为主,多个动态数据源为辅的结构。除了数据库,后续会结合shiro安全框架来搭建。 2、引用 在pom.xml添加框架Springboot +FastMybatis + Druid相关maven引用。

    2024年02月09日
    浏览(46)
  • Druid监控 + 多数据源配置

    先贴一下用的依赖项。 yaml配置文件的配置。 负责读取yaml文件的数据源配置,生成数据源。还有创建动态数据源容器。另外ServletRegistrationBean 和 FilterRegistrationBean的配置和生成。 就是我们的动态数据源,负责继承和初始化 AbstractRoutingDataSource。还有就是重写determineCurrentLookupKe

    2024年01月22日
    浏览(64)
  • SpringBoot3整合Druid数据源的解决方案

    druid-spring-boot-3-starter目前最新版本是1.2.20,虽然适配了SpringBoot3,但缺少自动装配的配置文件,会导致加载时报加载驱动异常。 需要手动在resources目录下创建 META-INF/spring/ 目录,并且在 META-INF/spring/ 创建 org.springframework.boot.autoconfigure.AutoConfiguration.imports , 文件中添加如下内容

    2024年03月09日
    浏览(104)
  • SpringBoot -02 SpringBoot整合Mybatis、Druid数据源、单元测试、JSP

    mybatis起步依赖 mysql启动依赖 数据源配置 mybatis相关配置 加载mybatis配置文件 mybatis别名配置 日志配置 加载mapper映射文件配置文件 http://localhost:8080/users Druid连接池后台监控:http://localhost:8080/druid/index.html SpringBoot对JSP的支持不是很友好,所以JSP很少被使用 springboot 不支持jsp 但是

    2024年02月06日
    浏览(88)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包