前言
今天操作数据库时发现了一个bug,上网搜索了一下解决了,就想着总结一下,bug放在文章的最后面。 文章如果有错误或者不规范的地方请指出来,一起加油,感谢大家观看!!!
spring:
datasource:
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: 123456
在数据库连接中,URL(Uniform Resource Locator,统一资源定位符)参数起着关键作用。以下是对数据库 URL 参数的解释说明:
一、通用结构
数据库连接 URL 通常具有特定的格式,以 JDBC(Java Database Connectivity)连接 MySQL 数据库为例,格式一般为:
jdbc:mysql://[host][:port]/[database][?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...
二、各部分含义
1.jdbc:mysql://:
这是 JDBC 连接 MySQL 数据库的前缀标识,表明使用 JDBC 连接 MySQL 数据库驱动程序。
2.[host]:
数据库服务器的主机名或 IP 地址。指定数据库服务器所在的位置,例如 “localhost” 表示本地主机,或者是一个具体的 IP 地址如 “192.168.1.100”。
3.[:port]:
可选参数,数据库服务器的端口号。MySQL 的默认端口号是 3306,但如果数据库服务器配置为使用不同的端口,则需要在 URL 中指定正确的端口号。
4.[database]:
要连接的数据库名称。指定要连接和操作的具体数据库。
5.[?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]...:
常用连接参数:
allowPublicKeyRetrieval=true|false:
含义:决定是否允许客户端从服务器自动检索公钥。如果设置为true,则允许检索公钥,这在某些情况下可以解决连接问题,但可能会带来一定的安全风险。如果设置为false,则不允许检索公钥。
示例:jdbc:mysql://localhost:3306/mydb?allowPublicKeyRetrieval=true
useSSL=true|false:
含义:指定是否使用 SSL(Secure Sockets Layer)加密连接。设置为true表示使用 SSL 加密连接,确保数据在传输过程中的安全性;设置为false表示不使用 SSL 连接。
示例:jdbc:mysql://localhost:3306/mydb?useSSL=false
characterEncoding=[encoding]:
含义:设置连接的字符编码。常见的编码有UTF-8、GBK等。确保客户端和服务器之间的数据传输使用正确的字符编码,以避免出现乱码问题。
示例:jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8
autoReconnect=true|false:
含义:当连接断开时,决定是否自动重新连接。如果设置为true,在连接断开时,驱动程序会尝试自动重新连接到数据库;如果设置为false,则不会自动重新连接。
示例:jdbc:mysql://localhost:3306/mydb?autoReconnect=true
zeroDateTimeBehavior=[behavior]:
含义:指定当数据库返回零日期时间值时的处理方式。常见的行为有exception(抛出异常)、convertToNull(转换为 null)等。
示例:jdbc:mysql://localhost:3306/mydb?zeroDateTimeBehavior=convertToNull
二、其他可能的参数
serverTimezone=[timezone]:
含义:设置服务器的时区。确保数据库中的日期时间值与客户端的时区一致,避免出现时间不一致的问题。
示例:jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC
connectTimeout=[milliseconds]:
含义:指定连接超时时间,以毫秒为单位。如果在指定的时间内无法建立连接,则连接尝试将失败。
示例:jdbc:mysql://localhost:3306/mydb?connectTimeout=5000
socketTimeout=[milliseconds]:
含义:设置套接字超时时间,以毫秒为单位。指定在读取或写入数据库时等待的最长时间,如果超过这个时间仍未完成操作,则会抛出超时异常。
示例:jdbc:mysql://localhost:3306/mydb?socketTimeout=10000
这些连接参数和配置选项可以根据具体的应用需求进行调整,以实现最佳的数据库连接性能和稳定性。在使用时,需要根据实际情况进行合理的配置,同时也要注意安全性和性能的平衡。通过正确配置数据库连接 URL 的各个参数,可以成功建立与数据库的连接,并进行数据的存储、检索和操作等各种数据库操作。
三、java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
先展示一下我之前的url
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
“Public Key Retrieval is not allowed” 错误原因及解决方法
原因分析: 这个错误通常是由于 MySQL 服务器配置不允许客户端自动检索服务器的公钥引起的。在某些情况下,MySQL 服务器可能会要求客户端显式地配置是否允许公钥检索,以提高安全性。
解决方法: 在连接字符串中添加allowPublicKeyRetrieval=true参数,例如:
jdbc:mysql://localhost:3306/mydb?allowPublicKeyRetrieval=true
确保你的数据库连接配置正确,并且你的 MySQL 服务器版本与 JDBC 驱动版本兼容。如果问题仍然存在,可以检查 MySQL 服务器的日志以获取更多详细信息。
如果我的内容对你有帮助,请点赞,评论,收藏。创作不易,大家的支持就是我坚持下去的动力!