问题引入
应用运行失败:
问题分析
从ERROR日志最后往前看,由于异常(msg:“请检查primary默认数据库设置”)导致调用DynamicDataSourceAutoConfiguration类init方
法失败,导致DataSourceHealthIndicatorAutoConfiguration类bean创建失败,导致healthIndicatorRegistry类bean创建失败,导致
healthEndpoint类bean创建失败,最终导致servletEndpointRegistrar类bean创建失败。
大概意思就是说,由于某个异常导致bean创建失败,应用启动失败。所以我们要分析这个异常
异常分析
DynamicRoutingDataSource类第200行:
根据下图分析:分组数据库和所有数据库都没有配置primary数据库,也就是首要数据库。
解决方法
发现项目引入了下面2个依赖:用来实现多数据源配置。发现Apollo配置并没有相关配置,所以出现异常,补充配置即可解决问题。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
引入新概念
SpringBoot + Mybatis-plus实现多数据源配置。即一个项目中使用多个数据源。由于第一次遇见,所以查阅了相关资料,总结了其用法。
1,引入相关依赖:dynamic-datasource-spring-boot-starter 和 druid-spring-boot-starter。
2,yml文件配置:
spring:
datasource:
#需要使用的数据库连接池实现,全限定名称.此处使用Druid,可以不用自己写配置,自己也可以自定义配置
type: com.alibaba.druid.pool.DruidDataSource
#JDBC 驱动程序的完全限定名称
driver-class-name: com.mysql.jdbc.Driver
#动态数据源
dynamic:
#首要数据库,默认使用哪个数据库
primary: db1
datasource:
db1:
url: jdbc:mysql://abc-dbrw.cn:3306/user?useUnicode=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&characterEncoding=UTF-8
username: aaa_rw
password: uoj8ijoifdoi
db2:
url: jdbc:mysql://def-dbwrite.cn:3306/order?useUnicode=true&characterEncoding=utf8&useSSL=false
username: bbb_rw
password: oifjdsoi9hiun
3,.在不同的类使用不同的数据源时加上注解 @DS(“数据源名称”)
//注意是Mybatis-plus中的写法
@Repository
@DS("db2")
public class UserService extends ServiceImpl<UserMapper, User> {
思考
1,多数据源是如何实现的,源码解析。
提示:
Spring相关的东西直接从XxxConfiguration, XxxProperties, XxxAutoProperties入手即可。
所以这个问题可以直接从dynamic-datasource-spring-boot-starter\2.5.1\dynamic-datasource-spring-boot-starter-2.5.1.jar包下找这3个类,入手即可。