admin管理员组

文章数量:1030681

【随笔】解决 dynamic

前言

最近在开发一个 Spring Boot 项目时,遇到了嵌入式 Tomcat 启动失败的问题,错误日志指向 dynamic-datasource 的主数据源配置问题。经过一番排查,发现是 dynamic-datasource 2.5.6 与 Spring Boot 2.7.7 的兼容性问题导致的。这篇文章记录了问题的分析与解决过程,希望能帮到遇到类似问题的同学。

问题描述

在启动 Spring Boot 应用时,Tomcat 抛出了以下异常:

代码语言:javascript代码运行次数:0运行复制
java.lang.RuntimeException: dynamic-datasource Please check the setting of primary

堆栈跟踪显示,DynamicDataSourceAutoConfiguration 中的 dataSource bean 初始化失败,导致一系列依赖(如 sqlSessionFactorySysCountryInfoMapper 等)无法创建,最终使应用上下文初始化失败,Tomcat 无法启动。

配置文件中使用了 dynamic-datasource 配置多数据源,核心部分如下:

代码语言:javascript代码运行次数:0运行复制
spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          password: root
          url: jdbc:mysql://127.0.0.1:3306/testa?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
        slave_1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          password: root
          url: jdbc:mysql://127.0.0.1:3306/testb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
      primary: master
      strict: false

表面上看,primary: master 配置正确,但启动时仍报错。

原因分析

经过调试和日志分析,发现问题根源在于版本兼容性:

  • 项目使用 Spring Boot 2.7.7(发布于 2022 年末),而 dynamic-datasource 使用的是 2.5.6 版本(发布于 2021 年)。
  • Spring Boot 2.7.7 引入了更新的依赖管理和自动配置机制,而 dynamic-datasource 2.5.6 可能未完全适配这些变更,尤其是在动态数据源的初始化逻辑上。
  • 具体来说,dynamic-datasource 2.5.6 在验证主数据源(primary)时,可能无法正确解析 Spring Boot 2.7.7 的自动配置环境,导致抛出 Please check the setting of primary 异常。

此外,配置中同时使用了 spring.datasource.druidspring.datasource.dynamic,这可能加剧了配置冲突,但核心问题仍归结于版本不兼容。

解决方案

为了解决问题,我采取了以下步骤:

  1. 升级 dynamic-datasource 版本

将 dynamic-datasource 升级到与 Spring Boot 2.7.7 兼容的较新版本。我选择了 4.2.0(截至 2025 年 4 月的最新版本之一)。 修改 pom.xml:

代码语言:javascript代码运行次数:0运行复制
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
  1. 检查配置兼容性

升级后,参考 dynamic-datasource 官方文档,确保配置符合新版本要求。幸运的是,我的配置无需大幅调整,仅保留 spring.datasource.dynamic 部分,移除可能冲突的 spring.datasource.druid 配置:

代码语言:javascript代码运行次数:0运行复制
spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          password: root
          url: jdbc:mysql://127.0.0.1:3306/testa?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
        slave_1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          password: root
          url: jdbc:mysql://127.0.0.1:3306/testb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
      primary: master
      strict: false
  1. 验证数据库连接

确保 MySQL 数据库(127.0.0.1:3306)可访问,确认 testa/testb 数据库存在,用户名 / 密码正确。

  1. 清理并重新构建项目

执行 mvn clean install,清理旧的依赖缓存,确保新版本生效。

升级后,应用启动正常,Tomcat 成功初始化,数据源切换功能也正常工作。

经验总结

在使用第三方库时。以下是一些经验教训:

  • 保持版本同步:Spring Boot 和第三方库(如 dynamic-datasource)的版本应尽量匹配,避免使用过旧的依赖。
  • 参考官方文档:升级前查看库的 GitHub 或官方文档,了解可能的配置变更或兼容性说明。
  • 简化配置:在排查问题时,尽量减少无关配置(如 druid),以降低干扰。
  • 启用调试日志:Spring Boot 的 debug 模式(logging.level.springframework: debug)能提供更多线索,加速问题定位。

参考资料

  • dynamic-datasource GitHub
  • Spring Boot 2.7.7 官方文档
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-04-14,如有侵权请联系 cloudcommunity@tencent 删除配置springbootdatasourcedynamic

【随笔】解决 dynamic

前言

最近在开发一个 Spring Boot 项目时,遇到了嵌入式 Tomcat 启动失败的问题,错误日志指向 dynamic-datasource 的主数据源配置问题。经过一番排查,发现是 dynamic-datasource 2.5.6 与 Spring Boot 2.7.7 的兼容性问题导致的。这篇文章记录了问题的分析与解决过程,希望能帮到遇到类似问题的同学。

问题描述

在启动 Spring Boot 应用时,Tomcat 抛出了以下异常:

代码语言:javascript代码运行次数:0运行复制
java.lang.RuntimeException: dynamic-datasource Please check the setting of primary

堆栈跟踪显示,DynamicDataSourceAutoConfiguration 中的 dataSource bean 初始化失败,导致一系列依赖(如 sqlSessionFactorySysCountryInfoMapper 等)无法创建,最终使应用上下文初始化失败,Tomcat 无法启动。

配置文件中使用了 dynamic-datasource 配置多数据源,核心部分如下:

代码语言:javascript代码运行次数:0运行复制
spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          password: root
          url: jdbc:mysql://127.0.0.1:3306/testa?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
        slave_1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          password: root
          url: jdbc:mysql://127.0.0.1:3306/testb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
      primary: master
      strict: false

表面上看,primary: master 配置正确,但启动时仍报错。

原因分析

经过调试和日志分析,发现问题根源在于版本兼容性:

  • 项目使用 Spring Boot 2.7.7(发布于 2022 年末),而 dynamic-datasource 使用的是 2.5.6 版本(发布于 2021 年)。
  • Spring Boot 2.7.7 引入了更新的依赖管理和自动配置机制,而 dynamic-datasource 2.5.6 可能未完全适配这些变更,尤其是在动态数据源的初始化逻辑上。
  • 具体来说,dynamic-datasource 2.5.6 在验证主数据源(primary)时,可能无法正确解析 Spring Boot 2.7.7 的自动配置环境,导致抛出 Please check the setting of primary 异常。

此外,配置中同时使用了 spring.datasource.druidspring.datasource.dynamic,这可能加剧了配置冲突,但核心问题仍归结于版本不兼容。

解决方案

为了解决问题,我采取了以下步骤:

  1. 升级 dynamic-datasource 版本

将 dynamic-datasource 升级到与 Spring Boot 2.7.7 兼容的较新版本。我选择了 4.2.0(截至 2025 年 4 月的最新版本之一)。 修改 pom.xml:

代码语言:javascript代码运行次数:0运行复制
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>
  1. 检查配置兼容性

升级后,参考 dynamic-datasource 官方文档,确保配置符合新版本要求。幸运的是,我的配置无需大幅调整,仅保留 spring.datasource.dynamic 部分,移除可能冲突的 spring.datasource.druid 配置:

代码语言:javascript代码运行次数:0运行复制
spring:
  datasource:
    dynamic:
      datasource:
        master:
          driver-class-name: com.mysql.cj.jdbc.Driver
          password: root
          url: jdbc:mysql://127.0.0.1:3306/testa?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
        slave_1:
          driver-class-name: com.mysql.cj.jdbc.Driver
          password: root
          url: jdbc:mysql://127.0.0.1:3306/testb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
          username: root
      primary: master
      strict: false
  1. 验证数据库连接

确保 MySQL 数据库(127.0.0.1:3306)可访问,确认 testa/testb 数据库存在,用户名 / 密码正确。

  1. 清理并重新构建项目

执行 mvn clean install,清理旧的依赖缓存,确保新版本生效。

升级后,应用启动正常,Tomcat 成功初始化,数据源切换功能也正常工作。

经验总结

在使用第三方库时。以下是一些经验教训:

  • 保持版本同步:Spring Boot 和第三方库(如 dynamic-datasource)的版本应尽量匹配,避免使用过旧的依赖。
  • 参考官方文档:升级前查看库的 GitHub 或官方文档,了解可能的配置变更或兼容性说明。
  • 简化配置:在排查问题时,尽量减少无关配置(如 druid),以降低干扰。
  • 启用调试日志:Spring Boot 的 debug 模式(logging.level.springframework: debug)能提供更多线索,加速问题定位。

参考资料

  • dynamic-datasource GitHub
  • Spring Boot 2.7.7 官方文档
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-04-14,如有侵权请联系 cloudcommunity@tencent 删除配置springbootdatasourcedynamic

本文标签: 随笔解决 dynamic