问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Spring Boot 实现数据源动态切换的最佳姿势!

创作时间:
作者:
@小白创作中心

Spring Boot 实现数据源动态切换的最佳姿势!

引用
CSDN
1.
https://blog.csdn.net/weixin_45334346/article/details/145460785

在Spring Boot项目中,有时需要根据不同的业务场景切换不同的数据源。本文将详细介绍如何实现数据源的动态切换,包括数据库准备、工程环境配置以及动态数据源的具体实现方法。

2.1、数据库准备

首先,我们需要创建两个数据库:

  • db_test_1
  • db_test_2

在db_test_1数据库中创建一张用户表,脚本如下:

在db_test_2数据库中创建另一张账户表,脚本如下:

2.2、工程环境准备

在pom.xml文件中添加相关的依赖包,示例如下:

<!--spring boot核心-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<!--spring boot 测试-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<!--mysql 驱动-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>
<!--mybatis-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
</dependency>
<!--aspectj 注解代理-->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>

2.3、编写动态数据源

2.3.1、创建动态数据源服务类

首先,创建一个DynamicDataSource类,并继承AbstractRoutingDataSource抽象类,同时重写determineCurrentLookupKey()方法,代码示例如下:

2.3.2、创建动态数据源缓存类

创建一个DataSourceContextHolder类,用于缓存数据源,同时需要确保线程环境下安全

package com.example.dynamic.datasource.config;

public class DataSourceContextHolder {
    /**
     * 设置线程独立变量,用于存储数据源唯一标记
     */
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    public static void setDataSourceKey(String key) {
        contextHolder.set(key);
    }

    public static String getDataSourceKey() {
        return contextHolder.get();
    }

    public static void clearDataSourceKey() {
        contextHolder.remove();
    }
}
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号