IT袋

当前位置:主页 > 经验教程 > 建站编程 >

Spring

Spring Boot + MyBatis-Plus 实现 MySQL 主从复制动态数据源切换(2)

时间:2023-12-16 13:23:12 来源:IT袋 作者:马勇
导读:Spring,2. 配置数据源 在 application.yml 文件中配置主从数据源信息。 注意这里我们要搭建主从数据库,只是在一个mysql实例中创建两个库,里面存在相同表 server:

Spring

2. 配置数据源

application.yml文件中配置主从数据源信息。注意这里我们要搭建主从数据库,只是在一个mysql实例中创建两个库,里面存在相同表

server:
  port: 8082
spring:
  datasource:
    master:
      username: root
      password: root
      url: jdbc:mysql://localhost:3306/shiro_db?useUnicode=true&characterEncoding=utf8
      driver-class-name: com.mysql.cj.jdbc.Driver
    slave:
      username: root
      password: root
      url: jdbc:mysql://localhost:3306/backend_db?useUnicode=true&characterEncoding=utf8
      driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml

3. 创建DatabaseType 枚举类型

创建DatabaseType 枚举类型,用于切换数据源时,确定连接的是哪个数据源

com.zbbmeta.config包下创建DatabaseType枚举类型

// 定义一个枚举类型 DatabaseType,表示系统中的数据库类型
public enum DatabaseType {
    MASTER,  // 主数据库类型
    SLAVE    // 从数据库类型
}

4. 配置数据源上下文

com.zbbmeta.holder包下创建一个DataSourceContextHolder类用于保存和获取当前线程使用的数据源类型

public class DatabaseContextHolder {
    private static final ThreadLocal<DatabaseType> contextHolder = new ThreadLocal<>();
    public static void setDatabaseType(DatabaseType databaseType) {
        contextHolder.set(databaseType);
    }
    public static DatabaseType getDatabaseType() {
        return contextHolder.get();
    }
    public static void clearDatabaseType() {
        contextHolder.remove();
    }
}

5. 配置动态数据源

我们创建了一个DynamicDataSource类,继承AbstractRoutingDataSource,用于实现动态数据源的切换。

AbstractRoutingDataSource是 Spring Framework 提供的一个抽象数据源类,用于实现动态数据源切换。它允许应用程序在运行时动态地切换到不同的数据源,从而支持多数据源的场景,比如数据库读写分离、主从复制等

AbstractRoutingDataSource介绍:

  • 动态数据源切换:AbstractRoutingDataSource 的核心思想是根据某个键值(lookup key)来决定使用哪个具体的数据源。这个键值是通过determineCurrentLookupKey()方法提供
  • 抽象类:AbstractRoutingDataSource 是一个抽象类,它提供了模板方法 determineCurrentLookupKey(),需要由子类实现
  • 实现 javax.sql.DataSource 接口:AbstractRoutingDataSource 实现了 javax.sql.DataSource 接口,因此可以像常规数据源一样被用于与数据库的交互。

相关阅读