使用dynamic datasource springboot starter实现多数据源及源码分析

下面我们来详细讲解使用dynamic datasource springboot starter实现多数据源及源码分析的完整攻略。

什么是dynamic datasource springboot starter?

dynamic datasource springboot starter是一款基于spring boot的多数据源解决方案,可以支持动态添加和删除数据源,可以方便地生成多数据源的连接池,使用起来非常方便。

使用步骤

1. 添加依赖

在项目的pom.xml文件中添加以下依赖:

<dependency>
  <groupId>com.github.yulichang</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>2.5.2</version>
</dependency>

2. 添加数据源配置

在application.properties或application.yml中添加数据源的配置信息,可以添加多个数据源:

spring.datasource.dynamic.datasource.master.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.dynamic.datasource.master.username=root
spring.datasource.dynamic.datasource.master.password=root

spring.datasource.dynamic.datasource.cluster.datasource-class-name=com.alibaba.druid.pool.DruidDataSource
spring.datasource.dynamic.datasource.cluster.url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.dynamic.datasource.cluster.username=root
spring.datasource.dynamic.datasource.cluster.password=root

3. 在代码中动态切换数据源

可以使用@DS注解来动态切换数据源,这里提供两个简单的示例。

示例一:在service层中动态切换数据源

在service层的方法上通过@DS注解来动态切换数据源。

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @DS("master")
    @Override
    public List<User> listMaster() {
        return userMapper.selectList(null);
    }

    @DS("cluster")
    @Override
    public List<User> listCluster() {
        return userMapper.selectList(null);
    }
}

示例二:在controller层中动态切换数据源

在controller层通过@DS注解来动态切换数据源。

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/listMaster")
    public List<User> listMaster() {
        return userService.listMaster();
    }

    @GetMapping("/listCluster")
    public List<User> listCluster() {
        return userService.listCluster();
    }
}

源码分析

dynamic datasource springboot starter的源码都在Github上,可以自行下载查看。这里简单讲解一下主要的实现原理。

数据源配置处理

首先,在DynamicDataSourceProperties类中将配置文件中的数据源信息进行解析,并存储在一个Map<String, DataSourceProperty>中。

@Data
@ConfigurationProperties(prefix = "spring.datasource.dynamic")
public class DynamicDataSourceProperties {

    private Map<String, DataSourceProperty> datasource = new HashMap<>();

    ...
}

动态创建数据源

DynamicDataSourceProvider类中,通过反射动态创建数据源,并使用DruidDataSourceWrapper对数据源进行包装处理,以便能够正确使用Druid的监控处理。

public abstract class DynamicDataSourceProvider {

    protected DruidDataSourceWrapper createDataSource(DataSourceProperty dataSourceProperty) {
        DruidDataSourceWrapper dsw = DruidDataSourceWrapperBuilder.create()
                .type(dataSourceProperty.getType())
                .url(dataSourceProperty.getUrl())
                .username(dataSourceProperty.getUsername())
                .password(dataSourceProperty.getPassword())
                .build();
        // 数据源监控处理
        if (dsw.getDataSource() instanceof DruidDataSource) {
            DruidDataSource druidDataSource = (DruidDataSource) dsw.getDataSource();
            if (StringUtils.isNotBlank(dataSourceProperty.getFilters())) {
                try {
                    druidDataSource.setFilters(dataSourceProperty.getFilters());
                } catch (SQLException e) {
                    throw new RuntimeException("druid datasource setFilters error", e);
                }
            }
            wallFilter(druidDataSource);
            statFilter(druidDataSource);
        }
        return dsw;
    }

    ...
}

数据源动态切换

DynamicDataSourceAspect类中,使用了AOP的思想,通过方法上的@DS注解来判断当前方法需要使用哪个数据源,然后在方法执行前将当前线程绑定的数据源进行切换。

@Aspect
public class DynamicDataSourceAspect {

    ....

    @Around("@annotation(ds)")
    public Object around(ProceedingJoinPoint point, DS ds) throws Throwable {
        ...
        try {
            // 切换数据源
            DynamicDataSourceContextHolder.setDataSourceLookupKey(ds.value());
            // 执行方法
            return point.proceed();
        } finally {
            // 将数据源释放
            DynamicDataSourceContextHolder.clearDataSourceLookupKey();
        }
    }

    ...
}

以上就是dynamic datasource springboot starter的使用方法和源码分析,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用dynamic datasource springboot starter实现多数据源及源码分析 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 学习javaweb如何配置Tomcat的热启动

    学习 JavaWeb 开发的第一步必须掌握如何配置 Tomcat 的热部署,这样对我们的开发有非常大的帮助。以下是配置 Tomcat 热部署的完整攻略: 1. 下载安装 Tomcat 首先,你需要到官网(https://tomcat.apache.org/)下载 Tomcat 的最新安装包,然后按照官方指南进行安装。这里以 Tomcat 9 版本为例。 2.…

    Java 2023年6月2日
    00
  • Springboot2.6.x的启动流程与自动配置详解

    Spring Boot 2.6.x的启动流程与自动配置详解 Spring Boot是一个快速开发框架,可以帮助开发人员快速构建Web应用程序。在Spring Boot 2.6.x版本中,启动流程和自动配置得到了进一步的优化和改进。本文将介绍Spring Boot 2.6.x的启动流程和自动配置详解,并提供两个示例。 Spring Boot 2.6.x的启动流…

    Java 2023年5月15日
    00
  • Java日常练习题,每天进步一点点(35)

    下面是完整的攻略: 概述 Java日常练习题是一系列Java练手题,旨在帮助Java初学者熟悉Java语言,加深对Java知识的理解。本篇题目为第35题,难度为中等。 题目描述 写一个Java程序,输入一个字符串,输出其中不重复的字符。 解题思路 我们可以使用HashMap来存储每个字符出现的次数,然后遍历HashMap,输出出现次数为1的字符即可。 以下是…

    Java 2023年5月19日
    00
  • 高分面试分析jvm如何实现多态

    针对“高分面试分析jvm如何实现多态”的问题,我们可以采用以下步骤进行解答: 1. 简要介绍多态的概念 多态是面向对象程序设计中的一个重要概念,它指的是在运行时确定对象类型,而非编译时确定类型。在多态的实现过程中,一个对象根据不同的上下文环境表现出不同的行为,实现了代码的灵活性和可扩展性。在Java中,多态的实现至少需要使用到继承、虚函数(也称为动态绑定或者…

    Java 2023年5月26日
    00
  • Mybatis的特点及优点

    让我来详细讲解一下Mybatis的特点及优点。 Mybatis的特点 是一款基于Java的ORM框架,它跟Hibernate等ORM框架不同的是,它对数据库的操作都是通过sql语句进行的,不需要编写复杂的持久化逻辑。因此,Mybatis具有以下几个特点: 1. SQL控制能力强 Mybatis允许开发者自定义SQL语句,并提供了非常灵活的SQL执行方式。开发…

    Java 2023年5月20日
    00
  • spring框架集成flyway项目的详细过程

    下面是“spring框架集成flyway项目的详细过程”的完整攻略。 一、什么是flyway? Flyway是一个开源的数据库迁移工具,可以帮助我们管理数据库版本的升级和降级。Flyway使用简单,不需要依赖任何第三方库,支持多种数据库,包括MySQL、Oracle、PostgreSQL等。 二、在spring框架中集成flyway 1. 添加依赖 在pom…

    Java 2023年5月19日
    00
  • 使用Java 压缩文件打包tar.gz 包的详细教程

    使用Java压缩文件打包tar.gz包是一项非常重要的技能。下面是详细的攻略: 1. 确保环境准备就绪 在开始之前,我们需要确保环境准备就绪。首先,需要确保你已经安装了Java开发环境(JDK)。其次,需要下载和安装Apache Ant工具包。最后,需要确保Java编译器的bin文件夹被添加到环境变量中。 2. 建立Ant的build.xml文件 在进行Ja…

    Java 2023年5月19日
    00
  • 上传自己的jar包到maven中央仓库的快速操作方法

    上传自己的jar包到Maven中央仓库是一个开发者在构建和发布Java项目时必经的过程。以下是完整的攻略,包含了上传Jar包的所有必要步骤。 准备工作 在上传Jar包之前,你需要完成以下准备工作: Maven账号:首先你需要在 Maven官网 上注册一个账号。提示:在必要的时候需要提交 JIRA ticket 来申请一些权限。 安装 GnuPG:用于生成 G…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部