Spring boot配置数据源报错之java.sql.SQLException和java.sql.SQLNonTransientConnectionException

本文记录了使用Springboot整合Mybatis过程中遇到的两个常见数据库连接问题:时区设置错误导致的java.sql.SQLException异常,以及因连接字符串格式不正确引发的java.sql.SQLNonTransientConnectionException异常。通过在数据库配置中正确设置serverTimezone属性和修正连接字符串中的语法错误,成功解决了上述问题。

周末想自己用Spring boot整合Mybatis写点简单的demo,没想到出了点以前没遇到过的bug,特记录一下

java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76) ~[mysql-connector-java-8.0.13.jar:8.0.13]

原因:在数据库配置项添加"serverTimezone=UTC"即可

 

java.sql.SQLNonTransientConnectionException: Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near ';characterEncoding=utf-8&useSSL=false&serverTimezone=UTC'.
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:79) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:131) ~[mysql-connector-java-8.0.13.jar:8.0.13]
	at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:227) ~[mysql-connector-java-8.0.13.jar:8.0.13]

原因:无效的数据库连接地址,"&"无法识别,直接用"&"连接数据库配置项目即可

 

修改后的application.yml配置如下:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testMybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    username: root
    password: root
    driver-class-name: com.mysql.jdbc.Driver

 

<think>好的,我现在需要帮助用户解决在Spring Boot 3中配置Druid数据源时遇到的启动错误,具体是连接URL未设置的SQL异常。让我先仔细分析问题。 首先,用户提到错误是“druid datasource connection url not set”,这通常意味着Spring Boot无法正确绑定数据源配置到Druid的属性上。可能的原因有几个: 1. **配置格式问题**:Spring Boot 3可能对配置文件的格式或属性名称有新的要求,比如是否使用了正确的前缀或者YAML的结构是否正确。 2. **依赖版本不兼容**:Druid的starter版本可能不支持Spring Boot 3,导致配置无法正确加载。比如,用户之前可能在使用较旧的Druid starter,而Spring Boot 3需要更高版本的依赖。 3. **属性绑定问题**:Druid的数据源属性可能需要特定的绑定方式,比如在配置类中使用`@ConfigurationProperties`注解是否正确应用,或者属性前缀是否正确。 接下来,我需要参考用户提供的引用内容。例如,引用[4]提到Spring Boot 2.0以上默认使用Hikari数据源,而用户现在想用Druid,可能需要排除Hikari的自动配置。此外,引用[5]中的用户使用了Druid的starter版本1.1.24,但Spring Boot 3可能需要更新的版本,比如1.2.18或更高,以保持兼容性。 然后,我应该分步骤考虑解决方案: - **检查依赖**:确认用户是否使用了支持Spring Boot 3的Druid starter版本。如果用户使用的是旧版本,升级到兼容版本可能解决问题。 - **配置文件**:检查application.yml中的配置是否正确,特别是数据源的URL、username、password是否在druid的配置块下,或者是否需要使用spring.datasource.druid前缀。 - **排除默认数据源**:在Spring Boot中,可能需要排除Hikari的自动配置,强制使用Druid。 - **配置类**:是否需要显式配置数据源Bean,特别是在属性绑定失败的情况下,手动创建DruidDataSource并注入配置属性。 另外,用户提供的引用[2]中的错误信息显示无法找到DruidDataSource的Bean,这可能是因为自动配置失败,或者依赖缺失。所以,确保依赖正确,并且配置属性被正确绑定是关键。 可能的解决方案步骤: 1. **更新Druid依赖**:使用与Spring Boot 3兼容的Druid starter版本,如1.2.18。 2. **调整配置属性**:在application.yml中正确设置spring.datasource.druid下的url、username、password,而不是在spring.datasource下直接设置。 3. **排除Hikari**:在@SpringBootApplication注解中排除Hikari的自动配置类。 4. **显式配置数据源Bean**:通过@Bean注解手动创建DruidDataSource,并使用@ConfigurationProperties绑定属性。 此外,还需要检查Spring Boot 3是否引入了其他变化,比如配置属性的迁移,或者新的验证机制导致旧配置失效。例如,Spring Boot 3可能要求更严格的属性名称,或者对数据源初始化的流程有调整。 最后,验证解决方案是否有效,比如编写一个简单的测试用例,或者在启动应用时查看日志,确认数据源是否正确初始化连接。</think>以下是解决Spring Boot 3中Druid数据源连接配置错误的逐步方案: --- ### 1. 检查依赖兼容性 Spring Boot 3.x需要对应Druid Starter **1.2.18及以上版本**。在`pom.xml`中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-3-starter</artifactId> <version>1.2.18</version> </dependency> ``` > **关键点**:旧版本Druid Starter可能不兼容Spring Boot 3.x[^4][^5]。 --- ### 2. 配置数据源属性 在`application.yml`中使用正确的属性前缀`spring.datasource.druid`: ```yaml spring: datasource: type: com.alibaba.druid.pool.DruidDataSource druid: url: jdbc:mysql://localhost:3306/test username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver ``` > **注意**:若直接使用`spring.datasource.url`会导致绑定失败,必须通过`druid`子级配置[^2][^4]。 --- ### 3. 排除默认数据源 在启动类添加排除HikariCP的自动配置: ```java @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) @EnableConfigurationProperties public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` --- ### 4. 手动配置数据源(可选) 若自动配置失效,手动创建DruidDataSource Bean: ```java @Configuration public class DruidConfig { @Bean @ConfigurationProperties("spring.datasource.druid") public DataSource druidDataSource() { return new DruidDataSource(); } } ``` --- ### 5. 验证日志输出 启动时检查日志是否出现以下关键信息: ``` Initializing DruidDataSource JDBC Driver: com.mysql.cj.jdbc.Driver JDBC URL: jdbc:mysql://localhost:3306/test ``` 若仍报错,检查MySQL驱动版本是否兼容(建议8.0+)[^1]。 --- ### 常见错误及解决 - **错误:Failed to bind properties under 'spring.datasource'** - **原因**:配置未放在`druid`层级下 - **修复**:将`url`/`username`/`password`移动到`spring.datasource.druid`下[^2] - **错误:No qualifying bean of type 'DruidDataSource'** - **原因**:未排除HikariCP自动配置 - **修复**:添加`exclude = DataSourceAutoConfiguration.class`[^4] ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值