本文记录在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=null
Caused 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