返回顶部
首页 > 资讯 > 精选 >SpringBoot多数据源配置的过程是什么
  • 515
分享到

SpringBoot多数据源配置的过程是什么

2023-06-25 13:06:19 515人浏览 独家记忆
摘要

本篇内容主要讲解“SpringBoot多数据源配置的过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springBoot多数据源配置的过程是什么”吧!前言多数据源的核心就是向 ioc 容

本篇内容主要讲解“SpringBoot多数据源配置的过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习springBoot多数据源配置的过程是什么”吧!

前言

多数据源的核心就是向 ioc 容器注入 AbstractRoutingDataSource 和如何切换数据源。注入的方式可以是注册 BeanDefinition 或者是构建好的 Bean,切换数据源的方式可以是方法参数或者是注解切换(其他的没想象出来),具体由需求决定。

我的需求是统计多个库的数据,将结果写入另一个数据库,统计的数据库数量是不定的,无法通过 @Bean 直接注入,又是统计任务,DAO 层注解切换无法满足,因此选择注册(AbstractRoutingDataSource 的)BeanDefinition 和方法参数切换来实现。下面以统计统计中日韩用户到结果库为例。

配置文件

master 为结果库,其他为被统计的数据库(china、japan 可以用枚举唯一标识,当然也可以用 String):

dynamic:  dataSources:    master:      driver-class-name: com.mysql.cj.jdbc.Driver      url: jdbc:Mysql://localhost:3306/result?useUnicode=true&characterEncoding=utf8xxxxxxxx      username: root      passWord: 123456    china:      driver-class-name: com.mysql.cj.jdbc.Driver      url: jdbc:mysql://localhost:3306/china?useUnicode=true&characterEncoding=utf8xxxxxxxx      username: root      password: 123456    japan:      driver-class-name: com.mysql.cj.jdbc.Driver      url: jdbc:mysql://localhost:3306/japan?useUnicode=true&characterEncoding=utf8xxxxxxxx      username: root      password: 123456    korea:      driver-class-name: com.mysql.cj.jdbc.Driver      url: jdbc:mysql://localhost:3306/korea?useUnicode=true&characterEncoding=utf8xxxxxxxx      username: root      password: 123456

对应的配置类:

package com.statistics.dynamicds.core.config;import com.statistics.dynamicds.core.Country;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Configuration;import java.util.Map;import static com.statistics.dynamicds.core.config.MultiDataSourceProperties.PREFIX;@Data@Configuration@ConfigurationProperties(prefix = PREFIX)public class MultiDataSourceProperties {  public static final String PREFIX = "dynamic";  private Map<Country, DataSourceProperties> dataSources;  @Data  public static class DataSourceProperties {    private String driverClassName;    private String url;    private String username;    private String password;  }}package com.statistics.dynamicds.core;public enum Country {  MASTER("master", 0),  CHINA("china", 86),  JAPAN("japan", 81),  KOREA("korea", 82),  // 其他国家省略  private final String name;  private final int id;  Country(String name, int id) {    this.name = name;    this.id = id;  }  public int getId() {    return id;  }  public String getName() {    return name;  }}

依赖

ORM 用的 JPA,SpringBoot 版本为 2.3.7.RELEASE,通过 Lombok 简化 GetSet。

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency>     <groupId>org.projectlombok</groupId>     <artifactId>lombok</artifactId>     <version>1.18.22</version>     <scope>provided</scope></dependency>

构建 AbstractRoutingDataSource

Spring 的动态数据源需要注入 AbstractRoutingDataSource,因为配置文件中被统计数据源不是固定的,所以不能通过 @Bean 注解注入,需要手动构建。

要在启动类加上 @Import(MultiDataSourceImportBeanDefinitionReGIStrar.class)。

要在启动类加上 @Import(MultiDataSourceImportBeanDefinitionRegistrar.class)。

要在启动类加上 @Import(MultiDataSourceImportBeanDefinitionRegistrar.class),重要的事情写三行。

package com.statistics.dynamicds.autoconfig;import com.statistics.dynamicds.core.DynamicDataSourceRouter;import com.statistics.dynamicds.core.Country;import com.statistics.dynamicds.core.config.MultiDataSourceProperties;import com.zaxxer.hikari.HikariDataSource;import org.springframework.beans.factory.support.AbstractBeanDefinition;import org.springframework.beans.factory.support.BeanDefinitionBuilder;import org.springframework.beans.factory.support.BeanDefinitionRegistry;import org.springframework.boot.context.properties.bind.Binder;import org.springframework.boot.jdbc.DataSourceBuilder;import org.springframework.context.EnvironmentAware;import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;import org.springframework.core.env.Environment;import org.springframework.core.type.AnnotationMetadata;import javax.annotation.Nonnull;import java.util.Map;import java.util.stream.Collectors;import static com.statistics.dynamicds.core.config.MultiDataSourceProperties.PREFIX;public class MultiDataSourceImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar, EnvironmentAware {  public static final String DATASOURCE_BEANNAME = "dynamicDataSourceRouter";  private Environment environment;  @Override  public void registerBeanDefinitions(@Nonnull AnnotationMetadata importinGClaSSMetadata, BeanDefinitionRegistry registry) {    MultiDataSourceProperties multiDataSourceProperties = Binder.get(environment)            .bind(PREFIX, MultiDataSourceProperties.class)            .orElseThrow(() -> new RuntimeException("no found dynamicds config"));    final HikariDataSource[] defaultTargetDataSource = {null};    Map<Country, HikariDataSource> targetDataSources = multiDataSourceProperties.getDataSources().entrySet().stream()            .collect(Collectors.toMap(                    Map.Entry::geTKEy,                    entry -> {              MultiDataSourceProperties.DataSourceProperties dataSourceProperties = entry.getValue();              HikariDataSource dataSource = DataSourceBuilder.create()                      .type(HikariDataSource.class)                      .driverClassName(dataSourceProperties.getDriverClassName())                      .url(dataSourceProperties.getUrl())                      .username(dataSourceProperties.getUsername())                      .password(dataSourceProperties.getPassword())                      .build();              dataSource.setPoolName("HikariPool-" + entry.getKey());              if (Country.MASTER == entry.getKey()) {                defaultTargetDataSource[0] = dataSource;              }              return dataSource;            }));    AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(DynamicDataSourceRouter.class)            .addConstructorArgValue(defaultTargetDataSource[0])            .addConstructorArgValue(targetDataSources)            .getBeanDefinition();    registry.registerBeanDefinition(DATASOURCE_BEANNAME, beanDefinition);  }  @Override  public void setEnvironment(@Nonnull Environment environment) {    this.environment = environment;  }}

上面代码中 MultiDataSourceProperties 不是由 @Resource 或者 @Autowired 获取的是因为 ImportBeanDefinitionRegistrar 执行的很早,此时 @ConfigurationProperties 的配置参数类还没有注入,因此要手动获取(加 @ConfigurationProperties 注解是为了使 IOC 容器中其他 Bean 能获取配置的 Country,以此来切换数据源)。

下面是 AbstractRoutingDataSource 的实现类 DynamicDataSourceRouter:

package com.statistics.dynamicds.core;import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;import java.util.Map;public class DynamicDataSourceRouter extends AbstractRoutingDataSource {  public DynamicDataSourceRouter(Object defaultTargetDataSource, Map<Object, Object> targetDataSources) {    this.setDefaultTargetDataSource(defaultTargetDataSource);    this.setTargetDataSources(targetDataSources);  }  @Override  protected Object determineCurrentLookupKey() {    return DataSourceContextHolder.getLookupKey();  }}

数据源切换

数据源的切换由 DataSourceContextHolder 和切面 DynamicDataSourceAspect 控制:

package com.statistics.dynamicds.core;public class DataSourceContextHolder {  private static final ThreadLocal<Country> HOLDER = ThreadLocal.withInitial(() -> Country.MASTER);  public static void setLookupKey(Country lookUpKey) {    HOLDER.set(lookUpKey);  }  public static Country getLookupKey() {    return HOLDER.get();  }  public static void clear() {    HOLDER.remove();  }}package com.statistics.dynamicds.core;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;@Aspect@Componentpublic class DynamicDataSourceAspect {  @Pointcut("execution(* com.statistics.dao..*.*(..))")  void aspect() {  }  @Around("aspect()")  public Object around(ProceedingJoinPoint joinPoint) throws Throwable {    for (Object arg : joinPoint.getArgs()) {      if (arg instanceof Country) {        DataSourceContextHolder.setLookupKey((Country) arg);        break;      }    }    try {      return joinPoint.proceed();    }finally {      DataSourceContextHolder.clear();    }  }}

到此,相信大家对“SpringBoot多数据源配置的过程是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: SpringBoot多数据源配置的过程是什么

本文链接: https://lsjlt.com/news/304925.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot多数据源配置的过程是什么
    本篇内容主要讲解“SpringBoot多数据源配置的过程是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot多数据源配置的过程是什么”吧!前言多数据源的核心就是向 IOC 容...
    99+
    2023-06-25
  • Springboot整合多数据源配置流程是什么
    这篇文章主要讲解了“Springboot整合多数据源配置流程是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Springboot整合多数据源配置流程是什么”吧!主要介绍两种整合方式,分别...
    99+
    2023-07-05
  • SpringBoot多数据源配置的全过程记录
    目录前言 配置文件 依赖 构建 AbstractRoutingDataSource 数据源切换 目录 总结 前言 多数据源的核心就是向 IOC 容器注入 AbstractRouti...
    99+
    2024-04-02
  • springboot多数据源配置
    简介 开发当中经常会遇到需要进行多库多表数据整合的需求,在无法拆分项目的情况下,就需要在一个项目中配置多数据源,实现多库数据的整合。本文是在springboot框架的基础上进行的多数据源配置,可参考,也欢迎指正 1、第一步:applicat...
    99+
    2023-08-24
    spring boot mybatis java database
  • springboot整合多数据源配置的方式是什么
    这篇文章将为大家详细讲解有关springboot整合多数据源配置的方式是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。简介主要介绍两种整合方式,分别是 springboot+mybati...
    99+
    2023-06-22
  • springboot怎么配置多数据源
    在Spring Boot中配置多个数据源可以通过以下步骤来实现: 在pom.xml文件中添加Spring Boot对多数据源的支...
    99+
    2023-10-23
    springboot
  • springboot mybatis druid配置多数据源教程
    目录1、项目代码结构2、导入基本依赖3、配置多数据源4、配置类5、启动类6、测试使用的表7、测试表对应的实体类8、持久层:dao层接口1、项目代码结构 2、导入基本依赖 记得需要导...
    99+
    2024-04-02
  • springboot如何配置多数据源
    在Spring Boot中配置多数据源可以通过创建多个DataSource bean,并使用@Primary和@Qualifier注...
    99+
    2024-04-08
    springboot
  • 怎么在SpringBoot中配置多数据源
    本篇文章为大家展示了怎么在SpringBoot中配置多数据源,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。多数据源配置首先是配置文件这里采用yml配置文件,其他类型配置文件同理我配置了两个数据源,一...
    99+
    2023-06-14
  • 怎么使用SpringBoot配置多数据源
    这篇文章主要介绍了怎么使用SpringBoot配置多数据源的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用SpringBoot配置多数据源文章都会有所收获,下面我们一起来看看吧。1. 引入jar包pom....
    99+
    2023-06-29
  • springboot下配置多数据源的方法
    一、springboot 简介SpringBoot使开发独立的,产品级别的基于Spring的应用变得非常简单,你只需"just run"。 我们为Spring平台及第三方库提 供开箱即用的设置,这样你就可以有条不紊地开始。多...
    99+
    2023-05-31
    spring boot 多数据源
  • jpa多数据源配置的步骤是什么
    配置JPA多数据源的步骤如下: 在application.properties或application.yml文件中配置多个数据...
    99+
    2024-04-08
    jpa
  • springboot中如何配置多数据源
    这期内容当中小编将会给大家带来有关springboot中如何配置多数据源,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、建库建表1.1 创建数据库db1和数据库db21.2 在数据库db1中创建表db1...
    99+
    2023-06-15
  • SpringBoot多数据源配置详细教程(JdbcTemplate、mybatis)
    多数据源配置 首先是配置文件 这里采用yml配置文件,其他类型配置文件同理 我配置了两个数据源,一个名字叫ds1数据源,一个名字叫ds2数据源,如果你想配置更多的...
    99+
    2024-04-02
  • ruoyi(若依)配置多数据源(mysql+postgresql),rouyi(Springboot)多数据源设置
    一、除了MySQL驱动,我们还需要用到postgresql的驱动,所以我们先把驱动的依赖给导入进来 org.postgresql postgresql ...
    99+
    2023-08-17
    mysql postgresql spring boot
  • SpringBoot怎么使用druid配置多数据源
    这篇“SpringBoot怎么使用druid配置多数据源”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringBoot怎...
    99+
    2023-07-05
  • SpringBoot多数据源配置并通过注解实现动态切换数据源
    目录1. 环境准备1.1 数据库准备1.2 项目创建2. ThreadLocal类介绍3. AbstractRoutingDataSource类介绍4. 具体实现4.1 定义数据源枚...
    99+
    2022-11-13
    SpringBoot 动态切换数据源 SpringBoot 切换数据源
  • springboot+springJdbc+postgresql 实现多数据源的配置
    背景 最近公司在服务拆迁,接口转移,相同的功能接口到要迁移到对应的服务中,因为时间比较赶,别问为什么没给时间,没人,没资源,但是活还是得干的,为了减少工作量和稳妥的需要分两步走 ...
    99+
    2024-04-02
  • SpringBoot整合MybatisPlus配置多数据源增强插件的方法是什么
    本篇内容介绍了“SpringBoot整合MybatisPlus配置多数据源增强插件的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2023-06-02
  • SpringBoot +DynamicDataSource切换多数据源的全过程
    目录固定多个数据源切换1.由于我这个版本的自带DynamicDataSource包2.在yml中配置两个数据源3.启动时启动连接池的方法获取4.载入各个连接池5.dynamicDat...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作