从今天开始我分享一下配置多数据源的多种方式,多维度、动态、多租户定制化配置多种数据源,此篇我们进行SpringBoot集成mybatis分包配置多数据源,这是比较通用的配置方式,大家也容易理解,废话少说我们进入正题!
1、数据库级数据准备:
在本地新建两个数据库,名称分别为user_master 和user_slave ,新建一张user
表,表结构就是通常的字段,姓名、年龄等,就不细说了。
2、pom文件核心jar引入:
<!-- spring 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mybatis 依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<!-- mysql 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
3、yml 多个数据源的配置信息:
server:
port: 8090 # 启动端口
spring:
datasource:
masterDb: # 数据源1
jdbc-url: jdbc:mysql://localhost:3306/user_master?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
slaveDb: # 数据源2
jdbc-url: jdbc:mysql://localhost:3306/user_slave?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
注意:各个版本的 springboot
配置 datasource
时参数有所变化,例如低版本配置数据库 url
时用 url
属性,高版本使用 jdbc-url
属性!
4、服务启动初始化数据源配置:每个库采用一个配置文件处理
4.1、 主数据源配置:
@Configuration
@MapperScan(basePackages = "com.nandao.multipledatasource.mapper.masterBb", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class MasterDataSourceConfig {
@Primary // 表示这个数据源是默认数据源, 这个注解必须要加,因为不加的话spring将分不清楚那个为主数据源(默认数据源),导致启动服务时会报找不到主数据源的错误
@Bean("db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.masterBb") //读取application.yml中的配置参数映射成为一个对象
public DataSource getDb1DataSource(){
return DataSourceBuilder.create().build();
}
@Primary
@Bean("db1SqlSessionFactory")
public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// mapper的xml形式文件位置必须要配置,不然将报错:no statement (这种错误也可能是mapper的xml中,namespace与项目的路径不一致导致)
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db1/*.xml"));
return bean.getObject();
}
@Primary
@Bean("db1SqlSessionTemplate")
public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
4.2、 从数据源配置:
@Configuration
@MapperScan(basePackages = "com.nandao.multipledatasource.mapper.slaveDb", sqlSessionFactoryRef = "db2SqlSessionFactory")
public class SlaveDataSourceConfig {
@Bean("db2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.slaveDb")
public DataSource getDb1DataSource(){
return DataSourceBuilder.create().build();
}
@Bean("db2SqlSessionFactory")
public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/db2/*.xml"));
return bean.getObject();
}
@Bean("db2SqlSessionTemplate")
public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
注意事项:
在 service
层中根据不同的业务注入不同的 dao
层如果是主从复制- -读写分离:比如 masterDb 中负责增删改,slaveDb 中负责查询。但是需要注意的是负责增删改的数据库必须是主库(master).
到此、最常用的多数据配置分享完毕,此维度业务场景是读写分离的场景,如果是不同的业务配置不同的数据源,也是类似的配置,只不过是业务数据源的名称不同而已,比如两个数据库:user_db、order_db等等,下篇我们从另外一个维度分享多数据源获取,根据请求的类型、用户,判断选用哪个数据源,动态获取,敬请期待!