好记性不如烂笔头,把自己做过的记录一下。一般多数据源的配置方式有两种
- 静态的多数据源:每个数据源配置一套mapper
- 动态的多数据源:多个数据源通用一套mapper
静态多数据源
- application.yml配置
(这里的demo.datasource.master、demo.datasource.slave是自定义的配置,可以修改)
#多数据源配置
demo:
datasource:
#主数据库 master库
master:
jdbc-url: jdbc:mysql://192.168.75.99:3307/database1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username: master
password: pass
# 从库数据源 slave库
slave:
jdbc-url: jdbc:mysql://192.168.75.99:3307/database2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username: slave
password: pass
- 新建两个数据源配置
MasterDataSourceConfig、SlaveDataSourceConfig
@Configuration
@MapperScan(basePackages = "com.xinhuo.demo.mapper.master",sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
@Primary
@Bean(name = "masterDataSource")
@ConfigurationProperties("demo.datasource.master")
public DataSource masterDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "masterSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
return sessionFactoryBean.getObject();
}
}
@Configuration
@MapperScan(basePackages = "com.xinhuo.demo.mapper.slave",sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveDataSourceConfig {
@Bean(name = "slaveDataSource")
@ConfigurationProperties("demo.datasource.slave")
public DataSource slaveDataSource(){
return DataSourceBuilder.create().build();
}
@Bean(name = "slaveSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sessionFactoryBean = new MybatisSqlSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource);
return sessionFactoryBean.getObject();
}
}
- 新建两套mapper,一个数据源使用一套mapper
public interface StudentMapper extends BaseMapper<Student> {
}
public interface Teacher extends BaseMapper<Teacher> {
}
- main方法使用使用exclude
禁用默认加载的application.properties单数据源配置
以及关闭mybatisPlus的一些自动注入
/**
* 使用exclude = {DataSourceAutoConfiguration.class}
* 禁用springboot默认加载的application.properties单数据源配置
* 关闭springBoot关于mybatisPlus的一些自动注入
*/
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisPlusAutoConfiguration.class})
@SpringBootApplication
public class SpringDatasourceDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringDatasourceDemoApplication.class, args);
}
}
- 验证多数据源的使用
@RestController
@RequestMapping("/base")
public class BaseController {
@Autowired
private StudentService studentService;
@Autowired
private TeacherService teacherService;
@PostMapping("/addStudentAndTeacher")
public ResultMsg addStudentAndTeacher(String studentName,String teacherName){
//新增一个学生
Student student = new Student();
student.setName(studentName);
studentService.save(student);
//新增一个教师
Teacher teacher = new Teacher();
teacher.setName(teacherName);
teacherService.save(teacher);
return ResultMsg.ok();
}
@RequestMapping("/find")
public ResultMsg find(){
//查询student表所有的学生
List<Student> studentList = studentService.list();
//查询teacher表所有的教师
List<Teacher> teacherList = teacherService.list();
JSONObject data = new JSONObject();
data.put("studentList",studentList);
data.put("teacherList",teacherList);
ResultMsg resultMsg = new ResultMsg();
resultMsg.setData(data);
return resultMsg;
}
}
6.用postman测试,新增不同数据源的学生和教师表记录,然后查询出来
可以看到静态的多数据源就配置成功了
动态的多数据源
动态的多数据源利用aop在service层或者dao层动态切换当前线程的数据源
springboot动态多数据源配置和使用(二)
springboot动态多数据源配置和使用(从数据库读取数据源配置)(三)
注:
- 多个数据库的application.yml文件,数据库连接用jdbcUrl或者jdbc-url,单个数据源可以用url
- SqlSessionFactoryBean需要改成MybatisSqlSessionFactoryBean,否则baseMapper自带的方法不能访问,但能访问*Mapper.xml中定义的方法或者接口注解的自定义sql的方法