Spring Boot整合Druid与Dynamic-Datasource多数据源配置:从错误到完美解决

发布于:2025-06-04 ⋅ 阅读:(31) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到