Spring Boot 3 + Druid + MySQL 数据库连接慢问题

这是由于触发了反向 DNS 查询导致。当一个 InetAddress 创建时包含了域名信息,getHostName() 方法会直接返回这个域名,否则会触发反向 DNS 解析,当配置的 DNS 服务器与目标 InetAddress 之前网络状况不佳就会产生延时。

两方面原因:
一、MySQL DNS反向解析,配置 skip-name-resolve 解决。修改 mysql 数据库配置文件,启用 skip-name-resolve  配置,这样就会跳过反向 DNS 解析,只会基于 IP 地址来进行连接和身份验证,加速连接过程并避免 DNS 配置或延迟导致的问题。请注意在增加该配置参数后,mysql 的授权表中的 host 字段就不能使用域名只能使用 ip ,因为配置 skip-name-resolve 禁止了域名解析。

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf,在 [mysqld] 节点下新增配置:
    [mysqld]
    # 禁用DNS反向解析客户端IP到主机名,禁用后只能使用IP连接,牺牲了使用主机名进行授权的灵活性。
    skip-name-resolve
sudo systemctl restart mysql

二、Druid 数据库连接池,管理页面为方便阅读,IP会反向解析为主机名展示:
方案一:(测试无效)配置 Druid 关闭反向 DNS 解析
1、yml 配置 spring.datasource.druid.connection-properties.druid.dns.enable=false
2、yml 配置 connection-properties: druid.dns.prefetch.disable=true
3、yml 配置 connection-properties: useConfigs=maxPerformance
4、在 JDBC URL 后面添加参数:?useConfigs=maxPerformance 或者明确指定 skipNameResolve=true。
jdbc:mysql://192.168.80.97:3306/jz_crm?useConfigs=maxPerformance&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=GMT%2B8&useSSL=false

方案二:(测试有效)修改系统的 hosts 文件
在应用程序所在服务器的 /etc/hosts (Linux) 或 C:\Windows\System32\drivers\etc\hosts (Windows) 文件中,添加一条静态映射。
192.168.1.100 db-server-01.example.com

方案三:(暂未测试)引入的 mybatis plus 包排除 mysql-connector-j-9.0.0.jar,然后重新引入 8.0.33 以下版本,因为此版本的 ConnectionImpl 没有 getHostName() 方法。