springboot集成mybatis后数据库连接失败
问题描述:
1.datasource配置:
//application.yaml
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 040224
logging:
level:
com.itheima: debug
pattern:
dateformat: HH:mm:ss
mybatis:
mapper-locations: classpath*:mapper/*.xml
2.报错信息
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
### The error may exist in file [F:\Java_Projects\Mybatis\mp-demo\target\classes\mapper\UserMapper.xml]
### The error may involve com.itheima.mp.mapper.UserMapper.queryUserById
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
翻译:
org.mybatis.spring.MyBatisSystemException:
嵌套异常是 org.apache.ibatis.exceptions.PersistenceException:
### 查询数据库时出错。原因:org.springframework.jdbc.CannotGetJdbcConnectionException: 无法获得JDBC连接;
嵌套异常是 java.sql.SQLNonTransientConnectionException: 无法创建到数据库服务器的连接。尝试重新连接3次。放弃。
### 错误可能存在于文件 [F:\Java_Projects\Mybatis\mp-demo\target\classes\mapper\UserMapper.xml]
### 错误可能涉及 com.itheima.mp.mapper.UserMapper.queryUserById
### 错误发生在执行查询时
### 原因:org.springframework.jdbc.CannotGetJdbcConnectionException: 无法获得JDBC连接;
嵌套异常是 java.sql.SQLNonTransientConnectionException: 无法创建到数据库服务器的连接。尝试重新连接3次。放弃。
翻译大致意思是尝试连接数据库三次后失败。
故障排查
1.检查数据库是否正常启动?
2.是否是密码错误?
3.是否是pom引入的各种依赖的版本存在冲突或存在过高、过低的问题?
经检查pom引入的各种依赖的版本导入正常且版本不存在冲突或存在过高、过低的问题。
4.是否为数据源文件application.yaml
的配置存在问题?
经检查,数据源文件配置无误,一切正常。
经分析后,发现代码没有问题,出问题的应该还是数据库连接的地方。
断点调试
我们找一个测试方法启动,然后打断点进行调试:
目前一切正常,我们进入下一步。
目前仍然正常,我们继续进行下一步。
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
### The error may exist in file [F:\Java_Projects\Mybatis\mp-demo\target\classes\mapper\UserMapper.xml]
### The error may involve com.itheima.mp.mapper.UserMapper.queryUserById
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
翻译:
org.mybatis.spring.MyBatisSystemException:
嵌套异常是 org.apache.ibatis.exceptions.PersistenceException:
### 查询数据库时出错。原因:org.springframework.jdbc.CannotGetJdbcConnectionException: 无法获得JDBC连接;
嵌套异常是 java.sql.SQLNonTransientConnectionException: 无法创建到数据库服务器的连接。尝试重新连接3次。放弃。
### 错误可能存在于文件 [F:\Java_Projects\Mybatis\mp-demo\target\classes\mapper\UserMapper.xml]
### 错误可能涉及 com.itheima.mp.mapper.UserMapper.queryUserById
### 错误发生在执行查询时
### 原因:org.springframework.jdbc.CannotGetJdbcConnectionException: 无法获得JDBC连接;
嵌套异常是 java.sql.SQLNonTransientConnectionException: 无法创建到数据库服务器的连接。尝试重新连接3次。放弃。
此时,仍然报错。我们刚才其实有注意到,在我们执行下述语句时,是先有application is running
弹出,后续才出现报错。
User user = userMapper.queryUserById(5L);
我们不妨大胆猜测一下,我们的application.yaml
文件存在我们不知道的问题。
我们先跟进username
的源码然后打断点。此时可以看到是一切正常的。
那么我们再对passoword
的源码打断点。
此时我们注意到,密码居然不是我们设置的040224
,而是16532
,难道是我们漏了某个地方吗?
我们先修改密码,改成12345
后再次尝试。
密码又正常了回到我们设置的密码,难道和密码位数有关,只能设置五位以内的位数吗?
我们尝试将密码修改为123456
,再次尝试。
一切正常,那么我们再将密码修改为012345
,再次尝试。
显然,密码又不正常了,难道密码不能以0数字开头?
查阅相关资料后,发现
yaml文件读取数字属性时先转化成Integer类型,如果需要的是String类型的数据,再将Integer类型转换成String类型的数据。
故障解决
yaml文件读取数字属性时先转化成Integer类型,如果需要的是String类型的数据,再将Integer类型转换成String类型的数据。
既然如此,我们尝试在密码两边加上""
。
显然,程序运行正常,故障解决。
故障总结
yaml文件读取数字属性时先转化成Integer类型,如果需要的是String类型的数据,再将Integer类型转换成String类型的数据。
因此,我们需要尽力避免使用0开头的数字
作为配置信息。或者将0开头数字
两边加上""
使其视为字符串。