深度剖析SpringBoot框架下关于项目运行时数据库连接失败的可能问题、解决方案

 更新时间:2026年05月13日 10:07:58   作者:H22345  
这篇文章给大家介绍SpringBoot框架下关于项目运行时数据库连接失败的可能问题、解决方案及深度剖析,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

一、问题场景

        在启动基于SpringBoot+MyBatis的图书管理系统项目并尝试注册/登录时,前端页面报错如下:

登录失败: ### Error querying database. 
Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection ### The error may exist in file [D:\develep\projects\Books\target\classes\mapper\UserMapper.xml] ### The error may involve com.example.mapper.UserMapper.selectByUsername ### The error occurred while executing a query ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection

        控制台日志报错如下:

连接失败! 错误类型: SQLException 错误信息: Access denied for user 'root'@'localhost' (using password: YES)
可能的原因:
MySQL服务未启动
数据库'library'不存在
用户名或密码错误
MySQL端口(3306)被占用或防火墙阻止
MySQL不允许远程连接(虽然这里是localhost) java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:114) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:840) at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:416) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:237) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:180) at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:144) at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:373)

        控制台日志的这段报错是我在com.example目录下使用Lingma这个AI工具plugin部署的一个数据库连接测试类(DatabaseConnectionTest.java)返回的信息,能够使报错信息更加通俗易懂并给出一份具有优先级的排除方案

二、问题原因

        依据控制台返回的信息,我依次排查了可能存在的问题:
        1.首先从数据库是否连接正常开始排查,测试连接是成功的(这里是一个坑)

        2.随后又在DataGrip数据库可视化工具中检查了library是否真实存在,答案也是肯定的

        3.在排查完前两个问题后,我在排查第三个问题时终于有了答案

        这段yaml文件中的核心数据源基础配置看似毫无问题,也没有报错提示,但关键就在于password——以0开头的密码。我了解到,通常情况下YAML解析器会尝试将password后面对应的这串key解析为数字,但在某些YAML版本中,前导0是表示八进制数的,也就是060711(八进制)= 25033(十进制),又或者被解析为整数60711(即去掉前导0)。而无论是哪种情况,都会导致配置数据库的密码错误,这是源于YAML的类型推断规则产生的。

        YAML 是一种智能的类型推断格式,它会根据值的格式自动判断类型:

# 这些能被解析为整数
age: 25           → Integer: 25
count: 100        → Integer: 100
# 这些能被解析为浮点数
price: 9.99       → Float: 9.99
rate: 0.5         → Float: 0.5
# 而这则会产生歧义
code: 060711      → 可能被解析为:
                    - 八进制数(YAML 1.1): 25033
                    - 整数(去掉前导0): 60711
                    - 字符串(YAML 1.2): "060711"

        因此MySQL在验证密码时则会接收到错误数据,进而导致数据库的连接失败。

三、解决方案

        一个比较显而易见的解决方法是修改数据库密码使其不以0开头,但这显然不是一个成熟的做法,更好的解决方案是添加引号:

# 无论是双引号还是单引号,都能将其解析为字符串:
code: "060711"    → String: "060711"
code: '060711'    → String: "060711"

        这样就能确定无论什么版本的YAML在解析时能够将其解析为字符串了

四、深度剖析

        看到这,似乎问题都已经解决了,就只是一个简单的YAML解析器在对于不够规范的数据输入方式的解析歧义问题。但,前面还有一个坑没填,那就是为什么排错的第一步的测试连接是成功的?

        这就要深究YAML规范、解析器实现差异以及IDE的特殊处理机制了。以下是我根据查询到的资料进行的总结:

        首先需要确认的是,在YAML 1.1版本确实存在将"0xxx"视为八进制的设计,这在新版1.2中被修正为字符串。但关键在于不同解析器的兼容性处理策略。

        而IDEA在测试连接时很可能做了隐式转换。当数据库驱动接收到数字密码时,多数驱动库会自动执行toString()转换,例如MySQL JDBC在接收到数字密码时会尝试隐性转换为字符串,但这个行为是不可靠的,因为在生产环境中如果配置读取后保持数字类型,就会导致连接失败。

        因此总结:测试成功不等于生产可用。IDEA的测试连接是独立环境,它可能使用了自己的配置解析逻辑,或者数据库驱动在测试连接时有更宽松的类型转换机制——这对于生产环境的连接属于向下兼容,这个现象反而说明生产环境更严格遵循了类型安全规范。

到此这篇关于深度剖析SpringBoot框架下关于项目运行时数据库连接失败的可能问题、解决方案的文章就介绍到这了,更多相关SpringBoot项目运行时数据库连接失败内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Mybatis配置之typeAlias标签的用法

    Mybatis配置之typeAlias标签的用法

    这篇文章主要介绍了Mybatis配置之typeAlias标签的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Java的HttpClient中使用POST请求传递参数两种常见方式

    Java的HttpClient中使用POST请求传递参数两种常见方式

    Apache HttpClient为开发者提供了丰富的接口,用于管理HTTP连接并执行请求,下面这篇文章主要介绍了Java的HttpClient中使用POST请求传递参数两种常见方式,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-06-06
  • 关于注解FeignClient的使用规范

    关于注解FeignClient的使用规范

    这篇文章主要介绍了关于注解FeignClient的使用规范,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • 云计算实验:Java MapReduce编程

    云计算实验:Java MapReduce编程

    这篇文章主要介绍了云计算实验:Java MapReduce编程, 居于Java围绕MapReduce编程展开详细内容,文章助大家掌握MapReduce编程,理解MapReduce原理,需要的朋友可以参考一下
    2021-12-12
  • Java实现Dbhelper支持大数据增删改

    Java实现Dbhelper支持大数据增删改

    这篇文章主要介绍了Java实现Dbhelper支持大数据增删改功能的实现过程,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • 微信小程序调用微信登陆获取openid及java做为服务端示例

    微信小程序调用微信登陆获取openid及java做为服务端示例

    这篇文章主要介绍了微信小程序调用微信登陆获取openid及java做为服务端示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 如何在java 8 stream表达式实现if/else逻辑

    如何在java 8 stream表达式实现if/else逻辑

    这篇文章主要介绍了如何在java 8 stream表达式实现if/else逻辑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • SpringBoot的跨域注解@CrossOrigin解析

    SpringBoot的跨域注解@CrossOrigin解析

    这篇文章主要介绍了SpringBoot的跨域注解@CrossOrigin解析,Spring Framework 4.2 GA为CORS提供了第一类支持,使您比通常的基于过滤器的解决方案更容易和更强大地配置它,所以springMVC的版本要在4.2或以上版本才支持@CrossOrigin,需要的朋友可以参考下
    2023-12-12
  • Java continue break制作简单聊天室程序

    Java continue break制作简单聊天室程序

    这篇文章主要为大家详细介绍了Java continue break制作简单聊天室程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Java设计模式之观察者模式(Observer模式)

    Java设计模式之观察者模式(Observer模式)

    这篇文章主要介绍了Java设计模式之观察者模式(Observer模式),文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04

最新评论