Caused by: java.lang.RuntimeException: 请检查primary默认数据库设置

问题引入

应用运行失败:
在这里插入图片描述

问题分析

 从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个类,入手即可。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,你遇到了一个运行时异常:Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: Cannot find implementation。这个异常通常是由于找不到某个类的实现导致的。解决这个问题的方法有以下几种: 1. 检查依赖项:首先,确保你的项目中包含了所需的依赖项。在Android开发中,你可以在项目的build.gradle文件中添加所需的依赖项。例如,如果你使用的是Gradle构建工具,你可以在dependencies部分添加所需的库。然后,重新构建你的项目并运行它。 2. 检查类路径:如果你确定依赖项已经正确添加到项目中,那么可能是类路径的问题。类路径是指Java虚拟机(JVM)用来查找类文件的路径。确保你的类路径包含了所需的类文件。你可以通过在命令行中使用java命令的-cp选项来指定类路径。例如,如果你的类文件位于一个名为lib的文件夹中,你可以使用以下命令来运行你的应用程序: ```shell java -cp lib/ YourMainClass ``` 3. 检查类名和包名:如果你确定依赖项和类路径都没有问题,那么可能是类名或包名的问题。确保你在代码中正确引用了类名和包名。检查你的import语句和类的全限定名是否正确。 4. 清除缓存和重新构建:有时候,清除构建缓存并重新构建项目可以解决一些奇怪的问题。你可以尝试清除你的项目的构建缓存,并重新构建它。 5. 检查编译版本:如果你在使用某个库或框架时遇到了这个问题,确保你的编译版本与该库或框架的要求相匹配。有时候,不同的库或框架需要特定的编译版本才能正常工作。 这些是解决Caused by: java.lang.ClassNotFoundException: Cannot find implementation异常的一些常见方法。根据你的具体情况,你可以尝试其中的一种或多种方法来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值