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