基于数据库一主多从的基础上,做读写拆分缓解数据库压力,或者在分库的基础上,对热点数据库做数据水平分表,这些都是很常见的优化行为。
具体配置可以看:
Mysql数据库主从复制同步手把手教学(Mac版配置 + Windows版配置 + 踩坑)
既然那么多库,那么代码中我们就要连接多个数据源,那么废话不多说,开始动手
我们都知道Mybatis它也是遵循着JDBC规范,要指定对应的Mapper接口对其进行动态代理,其次通过启动的时候Configuration读取配置文件,后续从里面获取用户名,驱动包,密码,端口号,数据库url等等信息,然后走JDBC那套创建链接,把连接放入连接池,创建SqlSessionFactory会话工厂(多数据源就是多个SqlSessionFactory),再通过SqlSession执行对应的SQL,返回结果集再通过resultMap进行ORM映射。
注意以下几点:
1:一定要排除默认的数据源扫描。
2:不同数据源的mapper一定要区分文件夹。
3:同一个mapper下的所有接口,都肯定是操作同一数据库的。
4:配置文件中url一定要写成jdbc-url,不然会报错: jdbcUrl is required with driverClassName
目录结构
那么过程就很清晰明了了,要配置多数据源,需要以下几步:
(1)排除SpringBoot的默认数据源扫描(因为这里配置多数据源的话配置文件信息要改,它默认读取的那个会读取不到)。
主启动类上面加:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
不然的话它会报错:
Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
(2)把多数据源配置到yml/properties/yaml文件中。
#DB1 Configuration:
spring.datasource.test1.driverClassName=com.mysql.jdbc.Driver
spring.datasource.test1.jdbc-url= jdbc:mysql://localhost:3306/cloud-frame-portal?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username=root
spring.datasource.test1.password=11111111
#DB2 Configuration:
spring.datasource.test2.driverClassName=com.mysql.jdbc.Driver
spring.datasource