【随笔】解决 dynamic
前言
最近在开发一个 Spring Boot 项目时,遇到了嵌入式 Tomcat 启动失败的问题,错误日志指向
dynamic-datasource
的主数据源配置问题。经过一番排查,发现是dynamic-datasource
2.5.6 与 Spring Boot 2.7.7 的兼容性问题导致的。这篇文章记录了问题的分析与解决过程,希望能帮到遇到类似问题的同学。
问题描述
在启动 Spring Boot
应用时,Tomcat
抛出了以下异常:
java.lang.RuntimeException: dynamic-datasource Please check the setting of primary
堆栈跟踪显示,DynamicDataSourceAutoConfiguration
中的 dataSource bean
初始化失败,导致一系列依赖(如
sqlSessionFactory
、SysCountryInfoMapper
等)无法创建,最终使应用上下文初始化失败,Tomcat
无法启动。
配置文件中使用了 dynamic-datasource
配置多数据源,核心部分如下:
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.druid
和 spring.datasource.dynamic
,这可能加剧了配置冲突,但核心问题仍归结于版本不兼容。
解决方案
为了解决问题,我采取了以下步骤:
- 升级 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>
- 检查配置兼容性
升级后,参考 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
- 验证数据库连接
确保 MySQL 数据库(127.0.0.1:3306)可访问,确认 testa/testb 数据库存在,用户名 / 密码正确。
- 清理并重新构建项目
执行 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 官方文档