背景
mysql 服务端为 5.7x 版本,本地 springboot 2.x,默认引入 mysql 版本为 8.x。
应用执行报错:
java.sql.SQLNonTransientConnectionException Could not create connection to database server
解决方式
明确指定 mysql 的版本为低版本:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
chat
解决方式
根据您提供的错误信息和搜索结果,解决 java.sql.SQLNonTransientConnectionException: Could not create connection to database server
错误的可能方法如下:
-
关闭SSL连接:由于MySQL 5.7和8.0在SSL/TLS协议上有所不同,您可以尝试在数据库连接URL中添加
useSSL=false
参数来关闭SSL连接。spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
-
更新MySQL驱动版本:确保您的Spring Boot项目中使用的MySQL驱动版本与您的MySQL服务器版本兼容。如果您的MySQL服务器是5.7版本,您可能需要将MySQL驱动版本降级以确保兼容性。
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> <!-- 确保版本与您的MySQL服务器版本兼容 --> </dependency>
-
添加
allowPublicKeyRetrieval
参数:如果您遇到Public Key Retrieval is not allowed
的错误,可以在数据库连接URL中添加allowPublicKeyRetrieval=true
参数。spring.datasource.url=jdbc:mysql://localhost:3306/your_database?allowPublicKeyRetrieval=true&useSSL=false
-
检查数据库连接配置:确保您的数据库URL、用户名和密码等配置正确无误。
-
时区问题:如果您的MySQL 8.0及以上版本和Spring Boot的默认时区不一致,可以在数据库连接URL中指定时区。
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC
-
检查防火墙和网络配置:确保没有网络或防火墙设置阻止您的Spring Boot应用与MySQL服务器之间的连接。
请尝试上述方法之一或组合,以解决您遇到的连接问题。如果问题仍然存在,可能需要进一步检查具体的网络配置或数据库服务器设置。
为什么要降低 mysql 的版本?8.x 的客户端驱动不兼容 5.x 的服务端吗?
MySQL 8.x 的客户端驱动在大多数情况下是兼容 MySQL 5.x 的服务端的,但确实存在一些配置和兼容性问题,需要特别注意。以下是几个关键点:
-
驱动类变更:在 MySQL 8.x 中,驱动类由
com.mysql.jdbc.Driver
更改为com.mysql.cj.jdbc.Driver
。因此,如果你的应用是基于 Spring Boot 2.x,默认引入的 MySQL 驱动版本是 8.x,你需要确保在配置文件中使用正确的驱动类名 。 -
SSL 连接问题:MySQL 8.x 版本默认启用了 SSL,而 MySQL 5.7 版本默认情况下可能没有启用 SSL。因此,你可能需要在 JDBC URL 中显式关闭 SSL,例如通过添加
useSSL=false
参数 。 -
时区问题:MySQL 8.x 版本对时区的处理更为严格,可能会出现时区相关的错误。你需要在 JDBC URL 中指定时区,例如
serverTimezone=UTC
或者serverTimezone=Asia/Shanghai
。 -
密码认证插件:MySQL 8.x 引入了新的密码认证插件
caching_sha2_password
,这可能会导致使用旧版本客户端连接时出现问题。你可能需要在 MySQL 8.x 的服务器配置中指定使用mysql_native_password
插件,或者在客户端连接字符串中指定allowPublicKeyRetrieval=true
来解决这个问题 。 -
兼容性选项:MySQL 8.x 提供了一些兼容性选项,例如通过设置
sql_mode
来兼容旧版本的 SQL 语法。 -
字符集变更:MySQL 8.0 的默认字符集由
latin1
变更为utf8mb4
,这可能导致一些依赖于默认字符集的应用程序出现乱码问题 。 -
JSON数据类型增强:在 MySQL 8.0 版本中,对 JSON 数据类型的支持得到了加强,但是与 5.7 版本的兼容性不佳,可能会导致一些查询和操作 JSON 数据的语句失效 。
综上所述,虽然 MySQL 8.x 的客户端驱动通常兼容 MySQL 5.x 的服务端,但需要特别注意上述配置和兼容性问题。通过适当配置和调整,可以确保应用能够顺利连接到 MySQL 5.7 的服务端。
参考资料
java.sql.SQLNonTransientConnectionException: Could not create connection to database server