springboot整合多数据源的配置以及切换

springboot整合多数据源的配置以及切换

1.0 引入POM依赖

 <!-- lombok插件 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- mysql驱动依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
                <version>8.0.15</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <!--阿里的druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.14</version>
        </dependency>
        <!--  mybatis-plus依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
        <!--dynamic-datasource多数据源配置-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>2.5.4</version>
        </dependency>

2.0 配置yml文件

spring:
autoconfigure:
#排除原生的druid的影响。
  exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
##使用druid数据源
#type: com.alibaba.druid.pool.DruidDataSource
  dynamic:
    #设置默认的数据源,默认值为master
    primary: master
    datasource:
      slave:  #mysql数据源
        url: jdbc:mysql://localhost:3306/ebuy?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false
        username: 账号
        password: 密码
        driver-class-name: com.mysql.cj.jdbc.Driver
        druid:
          #初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
          initial-size: 10
          #最大连接池数量
          max-active: 100
          #最小连接池数量
          min-idle: 10
          # 配置获取连接等待超时的时间
          max-wait: 6000
          #关闭Druid的防火墙wall
          filters: config,stat
          testOnBorrow: false
          testWhileIdle: true
          timeBetweenEvictionRunsMillis: 60000
      master: #mysql云数据源
        url: jdbc:mysql://云数据库外网ip地址:3306/test?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=false
        username: 账号
        password: 密码
        driver-class-name: com.mysql.cj.jdbc.Driver
        druid:
          #初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
          initial-size: 10
          #最大连接池数量
          max-active: 100
          #最小连接池数量
          min-idle: 10
          # 配置获取连接等待超时的时间
          max-wait: 6000
          #执行多行sql
          multiStatementAllow: true
            #关闭Druid的防火墙wall
          filters: config,stat
          testOnBorrow: false
          testWhileIdle: true
          timeBetweenEvictionRunsMillis: 60000

3.0 实例

项目结构
在这里插入图片描述

3.1 数据库表结构

3.1.1 主数据库(master)

数据库表:
在这里插入图片描述

3.1.2 从数据库(slave)

数据库表:
在这里插入图片描述

3.2 pojo

3.2.1 master的实体类Teacher

package org.mycompony.datasourceswitch.pojo.master;

import lombok.Data;

/**
 * @version V1.0
 * @ClassName:Teacher
 * @Description:TODO
 * @author: wuhaibo
 * @date:2020/8/15 10:20
 */
@Data
public class Teacher {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private Double money;
}

3.2.2 slave实体类

package org.mycompony.datasourceswitch.pojo.slave;

import lombok.Data;

/**
 * @version V1.0
 * @ClassName:Teacher
 * @Description:TODO
 * @author: wuhaibo
 * @date:2020/8/15 10:20
 */
@Data
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private Double money;
}

3.3 mapper

3.3.1 TeacherMapper

package org.mycompony.datasourceswitch.mapper.master;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Mapper;
import org.mycompony.datasourceswitch.pojo.master.Teacher;

/**
* @version V1.0
* @ClassName:TeacherMapper
* @Description:TODO
* @author: wuhaibo
* @date:2020/8/15 10:31
*/
@Mapper
@DS("master")
public interface TeacherMapper extends BaseMapper<Teacher> {
}

3.3.2 StudentMapper

package org.mycompony.datasourceswitch.mapper.slave;

import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.mycompony.datasourceswitch.pojo.slave.Student;

/**
 * @version V1.0
 * @ClassName:StudentMapper
 * @Description:TODO
 * @author: wuhaibo
 * @date:2020/8/15 10:31
 */
@Mapper
@DS("slave")
public interface StudentMapper extends BaseMapper<Student> {
}

3.4 TestController

package org.mycompony.datasourceswitch.controller;

import com.baomidou.dynamic.datasource.annotation.DS;
import lombok.extern.slf4j.Slf4j;
import org.mycompony.datasourceswitch.mapper.master.TeacherMapper;
import org.mycompony.datasourceswitch.mapper.slave.StudentMapper;
import org.mycompony.datasourceswitch.pojo.master.Teacher;
import org.mycompony.datasourceswitch.pojo.slave.Student;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;


/**
 * @version V1.0
 * @ClassName:TeacherController
 * @Description:TODO
 * @author: wuhaibo
 * @date:2020/8/15 10:34
 */
@RestController
@Slf4j
@RequestMapping("/api")
public class TeacherController {
    @Resource
    private TeacherMapper teacherMapper;
    @Resource
    private StudentMapper studentMapper;
    @RequestMapping("/getTeacherById")
    public Teacher  getTeacherById(){
        log.info("当前的默认数据源是单数据源,数据源名为 {}", "master");
        return  teacherMapper.selectById(1);
    }
    @RequestMapping("/getStudentById")
    public Student getStudentById(){
        log.info("当前的默认数据源是单数据源,数据源名为 {}", "slave");
        return studentMapper.selectById(1);
    }
}

4.0 测试

4.1启动项目

整合成功的图片
出现了上述图片就说明整合多数据源成功。

4.2 动态切换数据源测试

4.2.1 测试master主数据源getTeacherById()方法

测试结果:
在这里插入图片描述

4.2.2 控制台日志显示

在这里插入图片描述

4.2.3测试slave主数据源getStudentById()方法

测试结果:
在这里插入图片描述

@DS注解使用的注意事项

整合是遇见的坑

springboot整合多数据源以及切换遇到的坑 Caused by: java.lang.IllegalStateException: dbType not support : null

在 Spring Boot 中整合 MongoDB 多数据源,需要按照以下步骤操作: 1. 引入 MongoDB 的依赖 在 pom.xml 文件中引入 MongoDB 的依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> ``` 2. 配置数据源 在 application.properties 文件中配置多个数据源: ```properties # 数据源1 spring.data.mongodb.uri=mongodb://localhost:27017/db1 # 数据源2 mongodb2.uri=mongodb://localhost:27017/db2 ``` 3. 配置多数据源 创建多个数据源的配置类,继承自 `AbstractMongoConfiguration`,并重写 `mongoClient()` 方法: ```java @Configuration public class DataSourceConfig1 extends AbstractMongoConfiguration { @Value("${spring.data.mongodb.uri}") private String uri; @Override protected String getDatabaseName() { return "db1"; } @Override public MongoClient mongoClient() { return new MongoClient(new MongoClientURI(uri)); } } @Configuration public class DataSourceConfig2 extends AbstractMongoConfiguration { @Value("${mongodb2.uri}") private String uri; @Override protected String getDatabaseName() { return "db2"; } @Override public MongoClient mongoClient() { return new MongoClient(new MongoClientURI(uri)); } } ``` 4. 配置动态数据源 创建一个动态数据源,实现 `AbstractRoutingDataSource` 接口,重写 `determineCurrentLookupKey()` 方法: ```java public class DynamicDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSource(); } } ``` 5. 配置数据源上下文 创建一个数据源上下文,用于保存当前使用的数据源的名称: ```java public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public static void setDataSource(String dataSource) { contextHolder.set(dataSource); } public static String getDataSource() { return contextHolder.get(); } public static void clearDataSource() { contextHolder.remove(); } } ``` 6. 配置事务管理器 创建一个事务管理器,用于管理多个数据源的事务: ```java @Configuration @EnableTransactionManagement public class TransactionConfig implements TransactionManagementConfigurer { @Autowired private DynamicDataSource dynamicDataSource; @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dynamicDataSource); } } ``` 7. 完成动态数据源配置 在 `Application` 类中完成动态数据源的配置: ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public DynamicDataSource dynamicDataSource(DataSourceConfig1 dataSourceConfig1, DataSourceConfig2 dataSourceConfig2) { Map<Object, Object> targetDataSources = new HashMap<>(); targetDataSources.put("db1", dataSourceConfig1.mongoClient()); targetDataSources.put("db2", dataSourceConfig2.mongoClient()); DynamicDataSource dynamicDataSource = new DynamicDataSource(); dynamicDataSource.setDefaultTargetDataSource(dataSourceConfig1.mongoClient()); dynamicDataSource.setTargetDataSources(targetDataSources); return dynamicDataSource; } @Bean public MongoClient mongoClient(DynamicDataSource dynamicDataSource) { return dynamicDataSource; } @Bean public MongoTemplate mongoTemplate(DynamicDataSource dynamicDataSource) { return new MongoTemplate(dynamicDataSource); } } ``` 至此,就完成了 Spring Boot 整合 MongoDB 多数据源动态切换配置。在需要切换数据源的地方,可以使用 `DataSourceContextHolder.setDataSource("db1")` 进行动态切换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值