com.baomidou.dynamic.datasource.exception.CannotFindDataSourceException: dynamic-datasource can not find primary datasource at com.baomidou.dynamic.datasource.DynamicRoutingDataSource.determinePrimaryDataSource(DynamicRoutingDataSource.java:90) ~[dynamic-datasource-spring-boot-starter-3.4.1.jar:3.4.1] at com.baomidou.dynamic.datasource.DynamicRoutingDataSource.getDataSource(DynamicRoutingDataSource.java:141) ~[dynamic-datasource-spring-boot-starter-3.4.1.jar:3.4.1] at com.baomidou.dynamic.datasource.DynamicRoutingDataSource.determineDataSource(DynamicRoutingDataSource.java:77) ~[dynamic-datasource-spring-boot-starter-3.4.1.jar:3.4.1] at com.baomidou.dynamic.datasource.ds.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:43) ~[dynamic-datasource-spring-boot-starter-3.4.1.jar:3.4.1] at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158) ~[spring-jdbc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116) ~[spring-jdbc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79) ~[spring-jdbc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:324) ~[spring-jdbc-5.2.15.RELEASE.jar:5.2.15.RELEASE] at org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator.getProduct(DataSourceHealthIndicator.java:122) ~[spring-boot-actuator-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator.doDataSourceHealthCheck(DataSourceHealthIndicator.java:105) ~[spring-boot-actuator-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.actuate.jdbc.DataSourceHealthIndicator.doHealthCheck(DataSourceHealthIndicator.java:100) ~[spring-boot-actuator-2.3.12.RELEASE.jar:2.3.12.RELEASE] at org.springframework.boot.actuate.health.AbstractHealthIndicator.health(Abstract
时间: 2025-03-17 07:15:34 浏览: 479
<think>好的,我现在要帮用户解决CannotFindDataSourceException: dynamic-datasource can not find primary datasource这个异常问题。用户提到了Spring Boot和MyBatis-Plus,应该是使用动态数据源时出现的配置问题。首先,我需要回忆一下相关的解决方案。
根据用户提供的引用内容,尤其是引用[3],问题可能出在没有指定主数据源。动态数据源需要明确指定primary属性,否则框架不知道哪个是默认的数据源。所以,我应该先检查用户的配置是否正确,特别是spring.datasource.dynamic.primary有没有设置正确的数据源名称。
然后,引用[3]给出了一个正确的配置示例,用户需要确认自己的配置是否遵循了这个结构。比如,是否在datasource.dynamic下正确配置了primary,并且各个数据源的名称是否对应。可能用户的数据源名称写错了,或者没有正确缩进,导致配置没有生效。
另外,引用[2]提到可能是多数据源配置问题,用户可能在引入多个数据源时没有正确设置主数据源。需要检查是否所有数据源都正确配置,特别是primary指定的数据源是否存在。比如,如果primary设置为one,那么datasource下面必须有one的配置。
还有,可能用户没有正确引入依赖。动态数据源通常需要依赖如dynamic-datasource-spring-boot-starter,版本是否兼容Spring Boot项目?如果版本不对,可能会有问题。
接下来,还要检查数据源名称是否一致。例如,primary设置的是one,但数据源配置里写成了first或者其他名称,这样就会找不到主数据源。同时,数据源类型是否正确,比如driver-class-name是否正确,URL格式是否有误。
还有strict模式的问题,如果strict设置为true,当请求的数据源不存在时会报错,设置为false可以忽略,但主数据源必须存在。用户需要确认strict的设置是否符合需求。
然后,用户可能没有在启动类上添加@EnableDynamicDataSource注解,导致动态数据源功能没有启用。虽然有些版本可能不需要,但最好确认一下是否需要这个注解。
最后,检查日志是否有更详细的错误信息,帮助定位问题。比如,是否还有其他配置错误或依赖冲突。
总结一下,解决方案的步骤应该是:
1. 确认配置文件中正确指定了primary数据源。
2. 检查数据源名称是否一致。
3. 验证依赖是否正确引入。
4. 检查数据源连接参数是否正确。
5. 确认是否启用动态数据源注解。
6. 查看日志获取更多信息。
需要把这些步骤用清晰的中文解释给用户,并给出示例配置,确保用户能一步步检查和修改自己的代码。同时,要提醒用户注意配置的格式,比如缩进和属性名称是否正确,避免因为拼写错误导致的问题。</think>### 解决方案:CannotFindDataSourceException异常处理步骤
#### 1. **确认主数据源配置**
- 在`application.yml`中必须明确指定主数据源名称(`primary`属性),且名称需与下方数据源定义一致。例如:
```yaml
spring:
datasource:
dynamic:
primary: one # 主数据源名称需在下方datasource列表中定义
datasource:
one: # 必须与primary名称匹配
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db1
username: root
password: 123456
```
- **常见错误**:未配置`primary`属性,或名称拼写不一致[^3]。
#### 2. **检查多数据源依赖**
- 确保项目中引入`dynamic-datasource-spring-boot-starter`依赖,版本需与Spring Boot兼容:
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.2</version> <!--检查最新版本-->
</dependency>
```
- **依赖冲突**:若同时引入其他数据源工具(如Druid),需排除默认数据源[^1]。
#### 3. **验证数据源连接参数**
- 检查主数据源的`url`、`username`、`password`是否正确。例如:
```yaml
url: jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=Asia/Shanghai
```
- **特殊字符转义**:若密码含`@`或`#`,需用双引号包裹:`password: "123@456"`[^3]。
#### 4. **启用动态数据源注解**
- 在启动类添加`@EnableDynamicDataSource`(部分版本可能无需显式声明):
```java
@SpringBootApplication
@EnableDynamicDataSource
public class Application { ... }
```
#### 5. **检查strict模式**
- 若未启用严格模式(`strict: false`),允许动态切换未定义的数据源,但主数据源必须存在:
```yaml
spring:
datasource:
dynamic:
strict: false
```
#### 6. **日志分析与调试**
- 启用DEBUG日志查看数据源加载过程:
```yaml
logging:
level:
com.baomidou.dynamic: DEBUG
```
- **典型日志错误**:若显示`Datasource 'one' not found`,说明配置未正确加载[^2]。
---
### 配置示例(正确格式)
```yaml
spring:
datasource:
dynamic:
primary: one # 主数据源名称
strict: false
datasource:
one: # 主数据源配置
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db1?useSSL=false
username: root
password: 123456
two: # 其他数据源
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2
```
---
阅读全文
相关推荐

















