使用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日

相关文章

  • Java中在时间戳计算的过程中遇到的数据溢出问题解决

    在Java中,时间戳通常使用long类型数据表示,记录单位为毫秒或纳秒的时间戳。在进行时间戳计算时,可能会遇到数据溢出的问题,导致计算出现错误的结果。 解决数据溢出问题的方法是使用BigInteger类进行高精度计算。具体的步骤如下: 将long类型数据转换成BigInteger类型 java BigInteger b1 = BigInteger.value…

    Java 2023年5月20日
    00
  • 使用MyBatis进行简单的更新与查询方式

    MyBatis是一个优秀的ORM框架,提供了简单、快速的SQL实现方式。下面将详细讲解使用MyBatis进行简单的更新与查询方式的完整攻略。 1. 简单更新操作 MyBatis可以通过Mapper XML文件直接实现对数据的更新操作。以下是一个执行基本的更新SQL的示例: <!– Mapper XML文件 –> <update id=&…

    Java 2023年5月19日
    00
  • Java基础-Java的体系结构

    Java的体系结构 Java的体系结构包含三个核心部分:JVM、JRE和JDK。其中JDK是对JRE的扩展,而JRE又是对JVM的扩展。 JVM JVM,即Java虚拟机,是Java平台的最核心部分。它是Java的运行环境,其作用是将Java字节码文件解释成能够在特定操作系统中运行的机器语言,并将其加载到内存中。 Java语言的跨平台特性正是由JVM所实现的…

    Java 2023年5月19日
    00
  • Java和Ceylon对象的构造和验证

    Java和Ceylon对象的构造和验证 在Java和Ceylon中,对象的构造和验证是代码编写中必须掌握的基本技能。本文将详细讲解如何构造和验证Java和Ceylon对象。 Java对象的构造和验证 Java中的对象构造需要使用类的构造函数,并通过关键字“new”创建对象。例如,我们有一个名为“Person”的Java类,如下所示: public class…

    Java 2023年5月26日
    00
  • JVM 参数的作用是什么?

    以下是关于 JVM 参数的作用的完整使用攻略: JVM 参数的作用 JVM 参数是用来控制 JVM 行为的一些参数,可以通过命令行或配置文件等方式传递给 JVM。JVM 参数可以用来调整 Java 程序的性能、稳定性和安全性等方面的表现。通过设置不同的 JVM 参数,可以控制 JVM 的堆大小、选择垃圾回收器、设置线程栈大小等,从而优化程序的性能和稳定性。 …

    Java 2023年5月12日
    00
  • Sprint Boot @JsonTypeInfo使用方法详解

    @JsonTypeInfo是Spring Boot中的一个注解,用于在序列化和反序列化Java对象时,指定类型信息。在本文中,我们将详细介绍@JsonTypeInfo注解的作用和使用方法,并提供两个示例。 @JsonTypeInfo注解的作用 @JsonTypeInfo注解用于在序列化和反序列化Java对象时,指定类型信息。当使用@JsonTypeInfo注…

    Java 2023年5月5日
    00
  • Java实现学生管理系统详解流程

    Java实现学生管理系统详解流程 一、系统需求分析 1.1 系统功能需求 添加学生信息 删除学生信息 修改学生信息 查询学生信息 显示所有学生信息 1.2 系统性能需求 界面友好,操作简单明了 对学生信息进行持久化存储,确保数据不会丢失 查询、添加、删除、修改操作均要快速、正确 二、系统设计 2.1 数据库设计 使用MySQL数据库存储学生信息,设计学生表s…

    Java 2023年5月19日
    00
  • Java Hibernate使用方法及整合查询

    下面我将详细讲解”Java Hibernate使用方法及整合查询”的完整攻略。 什么是Hibernate Hibernate是Java语言中一个开放源代码的对象关系映射框架,它对JDBC进行了封装,使Java程序员可以使用面向对象的思维来操作数据库。Hibernate可以自动将Java中的对象和关系数据库之间进行映射,使数据库的表结构和Java中的类结构相同…

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