使用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简单快速排序实例解析 快速排序是一种常用的排序算法,其本质是通过不断地把数列分成两个部分,分别进行递归排序,最终完成整个数列的排序。 实现思路 快速排序的实现思路如下: 选择一个基准元素,在数列中选择一个数作为基准元素pivot,一般选择第一个或者最后一个元素; 分割数组,将数列中所有小于基准元素的数放在它的左侧,所有大于基准元素的数放在它的右侧; …

    Java 2023年5月19日
    00
  • Spring Mvc中传递参数方法之url/requestMapping详解

    Spring MVC中传递参数方法之URL/RequestMapping详解 在Spring MVC中,我们可以通过URL和RequestMapping来传递参数。本文将详细介绍Spring MVC中传递参数的方法,并提供两个示例说明。 URL传递参数 在Spring MVC中,我们可以通过URL来传递参数。以下是一个简单的URL传递参数示例,它将参数id传…

    Java 2023年5月17日
    00
  • Jersey框架的统一异常处理机制分析

    Jersey框架是JavaEE官方提供的RESTful web服务框架,它提供了丰富的功能和易用的API,帮助开发人员快速构建RESTful web服务。在实际应用中,由于外部请求的多变性,我们难以避免出现各种异常情况。为了提高应用程序的健壮性和可维护性,Jersey框架提供了完善的异常处理机制。下面将结合具体案例,给大家详细讲解Jersey框架的统一异常处…

    Java 2023年5月19日
    00
  • uploadify在Firefox下丢失session问题的解决方法

    针对“uploadify在Firefox下丢失session问题”的解决方法,以下是一个完整的攻略: 问题描述 使用uploadify上传文件时,在Firefox浏览器下登录用户的session会丢失。这会导致用户无法正确地上传文件和访问相关的API。 解决方案 有两种解决方案可供选择。 方案一:关闭Firefox的cookie隐私模式 这个问题的根本原因是…

    Java 2023年6月15日
    00
  • SpringBoot集成Mybatis并测试

    下面是SpringBoot集成Mybatis并测试的完整攻略: 环境准备 在开始之前,我们需要进行一些准备工作: JDK环境和Maven环境的安装 IntelliJ IDEA或Eclipse IDE的安装 数据库环境的配置以及需要连接的数据库 项目配置 创建项目 在IDE中创建一个SpringBoot项目,并添加所需依赖。pom.xml中需要添加如下依赖: …

    Java 2023年5月20日
    00
  • Java NIO原理图文分析及代码实现

    Java NIO原理图文分析及代码实现 简介 Java NIO(Non-blocking I/O)是一种可替代Java标准I/O的I/O API。相比传统的I/O,Java NIO提供的I/O操作更快速、更灵活,并且支持更多的操作(如块传输和多路复用)。 基本组成部分 Java NIO的核心组件主要包含以下几个部分: Channel(通道):基本的I/O操作…

    Java 2023年5月19日
    00
  • java应用cpu占用过高问题分析及解决方法

    Java应用CPU占用过高问题分析及解决方法 现象描述 在运行Java应用过程中,发现CPU占用率过高,导致系统响应变慢,严重影响应用的性能和稳定性 原因分析 Java应用CPU占用高的原因可能有很多,下面列举一些常见的原因: 程序中存在大量的死循环或者无限递归调用 程序中存在大量的同步操作,导致CPU不停的进行上下文切换 程序中存在大量的IO操作,导致CP…

    Java 2023年5月26日
    00
  • 手把手教你如何获取微信用户openid

    下面是详细讲解“手把手教你如何获取微信用户openid”的完整攻略。 准备工作 申请微信公众号账号,开通开发者模式。 在公众号开发者中心配置服务器相关信息。 获取 openid 方法一:利用微信网页授权机制获取 在微信公众平台开发者中心,打开网页开发,配置公众号授权域名,并设置网页授权的回调域名。 在前端页面中,引入微信JS-SDK,并使用 wx.confi…

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