启动报错速查
启动失败类问题约占历史 issue 的 6%。下面按报错文案索引。
排查心法
先看完整堆栈最底部的第一个 Caused by: ——那才是真实原因,上层往往只是被包装过的表象。
1. Failed to determine a suitable driver class / 'url' attribute is not specified
Spring Boot 认为你要走「默认单数据源」装配,但没找到可用的 url/driver。按以下顺序检查:
- 数据源是否真的在
spring.datasource.dynamic.datasource之下? 不少案例是漏了一层或拼错了前缀,导致 dynamic 拿到的清单为空; spring.datasource.dynamic.enabled是否被设成了false? 关闭后框架不再接管;- 是否同时引入了
druid-spring-boot-starter? 它的DruidDataSourceAutoConfigure会抢先创建默认数据源,与 dynamic 冲突。官方建议排除:
spring:
autoconfigure:
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
- 配置文件是否真的被打包/加载? 多模块项目里 yml 未落入运行 jar、profile 未激活都会造成「本地好好的,打包就找不到 url」(#193)。
另一种常见情况:想只留一个
master,却把 url 配在了老的spring.datasource.url(不在 dynamic 下),框架无从加载。
2. Please check the setting of primary / CannotFindDataSourceException: can not find primary datasource
primary 指向的数据源/组不存在。检查:
spring.datasource.dynamic.primary的值是否与某个数据源键完全一致(含组名规则:slave_1、slave_2属于组slave,若primary: slave则命中组);- 数据源清单是否为空(结合第 1 条自查);
- 多环境 profile 是否覆盖丢失;
- 参考 #141、#146、#148、#341。
3. CannotFindDataSourceException: could not find a datasource named xxx
这是 strict: true 下的正确报错——你切换的 key 不存在。见@DS 不生效排查总表第 5 项。
4. enabled P6SPY ,however without p6spy dependency / enabled ALIBABA SEATA,however without seata dependency
开了开关却没加依赖。补依赖,或关闭开关:
spring:
datasource:
dynamic:
p6spy: false
seata: false
5. NoClassDefFoundError: io/seata/rm/datasource/SeataDataSourceProxy 等同类错误
启动期加载了 Seata 相关类但依赖缺失(#332)。按第 4 条处理;若确实需要 Seata,见集成 Seata。
6. java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy
典型症状:Spring Boot 3 项目用了 Boot 2 的 starter 产物(或反之),注解里引用的类在新 JDK/新 Boot 下不存在(#518、#524)。
按 Spring Boot 大版本选择对应 starter 产物:
| Spring Boot | 依赖 artifactId |
|---|---|
| 1.5.x / 2.x | dynamic-datasource-spring-boot-starter |
| 3.x(JDK 17+) | dynamic-datasource-spring-boot3-starter |
| 4.x | dynamic-datasource-spring-boot4-starter |
7. druid 版本兼容窗口
- 3.6.1 及更早版本与 druid 1.2.17+ 不兼容(构造方式变化),启动即失败;修复在 4.0.0(#494、#497、#500、#506);
- druid 1.2.22 起
DruidDataSourceAutoConfigure行为变化导致的冲突,按第 1 条第 3 点排除(#632); - 结论:保持 dynamic-datasource 4.x + 较新 druid。
8. Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
这不是框架自身报错,而是 MyBatis(-Plus) 装配问题在接入多数据源后暴露。确认 mybatis(-plus) starter 与 Spring Boot 大版本匹配、容器中只存在一个 SqlSessionFactory、Mapper 扫描配置正确(#69、#280、#722)。集成姿势见集成 MyBatis-Plus。
9. 启动时某个库连不上,整个应用起不来
框架默认在启动期创建所有数据源。若希望「连不上不阻塞启动」:
lazy: true:数据源延迟到首次使用时创建,启动期完全不建池,见懒加载数据源;- 池层面放宽:Hikari
initialization-fail-timeout: -1(不等待建连);Druidfail-fast: false+initial-size: 0。
10. 启动日志理解
| 日志 | 含义 |
|---|---|
dynamic-datasource initial loaded [N] datasource,primary datasource named [master] | 正常 |
initial loaded [0] datasource,Please add your primary datasource or check your configuration | 数据源清单为空——回第 1 条 |
dynamic-datasource start closing .... + all closed success,bye | 正常关闭流程的日志,不是错误 |
相关文档
- 连接池集成 —— 参数层级、druid 版本窗口与监控
- 完整配置参考
- @DS 不生效排查总表