从今天开始我分享一下配置多数据源的多种方式,多维度、动态、多租户定制化配置多种数据源,此篇我们进行SpringBoot集成mybatis分包配置多数据源,这是比较通用的配置方式,大家也容易理解,废话少说我们进入正题!
1、数据库级数据准备:
在本地新建两个数据库,名称分别为user_master 和user_slave ,新建一张user表,表结构就是通常的字段,姓名、年龄等,就不细说了。
2、pom文件核心jar引入:
org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.0 mysql mysql-connector-java runtime
3、yml 多个数据源的配置信息:
server:port: 8090 # 启动端口
spring:datasource: masterDb: # 数据源1jdbc-url: jdbc:mysql://localhost:3306/user_master?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.DriverslaveDb: # 数据源2jdbc-url: jdbc:mysql://localhost:3306/user_slave?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8username: rootpassword: rootdriver-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等等,下篇我们从另外一个维度分享多数据源获取,根据请求的类型、用户,判断选用哪个数据源,动态获取,敬请期待!