Spring Boot整合Druid与Dynamic-Datasource多数据源配置:从错误到完美解决
本文记录在Spring Boot 2.X项目中整合Druid连接池和Dynamic-Datasource多数据源时遇到的典型错误
DataSource returned null from getConnection()
的完整解决过程,包含详细的错误分析和解决方案。
问题背景
在Spring Boot 2.7项目中,我需要整合:
- Druid:阿里开源的数据库连接池,提供强大的监控功能
- Dynamic-Datasource:基于MyBatis-Plus的多数据源组件
配置完成后启动项目,出现以下关键错误日志:
SqlSession [...] was not registered for synchronization because synchronization is not active
13:46:49.312 WARN c.alibaba.druid.pool.DruidDataSource [1144]
- getConnection but jdbcUrl is not set,jdbcUrl=null,username=nullCaused by: org.springframework.jdbc.CannotGetJdbcConnectionException:
Failed to obtain JDBC Connection: DataSource returned null from getConnection(): {CreateTime:"2025-06-03 13:46:41",ActiveCount:0,PoolingCount:0,CreateCount:0,DestroyCount:0,CloseCount:0,ConnectCount:0,Connections:[]
}
错误原因深度分析
1. 数据源初始化失败
- 连接池状态显示所有计数为0,表明数据源未正确初始化
- Druid报出
jdbcUrl is not set
,说明关键连接参数未注入
2. 配置冲突(核心原因)
- Druid自动配置 与 Dynamic-Datasource自动配置 冲突
- 手动创建的
DataSource
Bean覆盖了动态数据源配置
3. 连接池冲突
- Spring Boot默认使用HikariCP连接池
- 未排除HikariCP导致连接池实现冲突
4. 多数据源配置问题
@DS
注解指定的数据源名称与配置不一致- YAML配置格式错误,数据源参数未正确绑定
完整解决方案
步骤1:修正依赖配置(pom.xml)
<dependencies><!-- 排除默认连接池 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><exclusions><exclusion><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId></exclusion></exclusions></dependency><!-- Druid连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter