高版本 MySQL 驱动的 DNS 陷阱
背景项目使用 OceanBase 数据库并通过 ShardingSphere JDBC 实现分表。由于 ShardingSphere 当前不支持jdbc:oceanbase:协议我们在代码中将连接串替换为jdbc:mysql并引入 MySQL 驱动dependency groupIdcom.oceanbase/groupId artifactIdoceanbase-client/artifactId version2.4.8/version /dependency dependency groupIdorg.apache.shardingsphere/groupId artifactIdshardingsphere-jdbc/artifactId version5.5.2/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId !-- 问题根源 -- version8.4.0/version /dependency数据源配置如下关键部分spring: datasource: driver-class-name: com.oceanbase.jdbc.Driver url: jdbc:oceanbase:loadbalance://IP:PORT/test?... druid: initial-size: 8 max-active: 30 min-idle: 8Configuration public class ShardingDataSourceConfiguration { Value(${spring.datasource.url}) private String url; Value(${spring.datasource.username}) private String username; Value(${spring.datasource.password}) private String password; private MapString, DataSource createDataSourceMap() { MapString, DataSource dataSourceMap new HashMap(); DruidDataSource dataSource1 new DruidDataSource(); dataSource1.setDriverClassName(com.mysql.cj.jdbc.Driver); url url.replace(jdbc:oceanbase, jdbc:mysql); dataSource1.setUrl(url); dataSource1.setUsername(username); dataSource1.setPassword(password); dataSource1.setInitialSize(8); dataSource1.setMaxActive(30); dataSource1.setMinIdle(8); dataSourceMap.put(ds_0, dataSource1); return dataSourceMap; } Bean(shardingDataSource) public DataSource dataSource() throws SQLException { Properties props new Properties(); props.put(sql-show, false); return ShardingSphereDataSourceFactory.createDataSource( createDataSourceMap(), Collections.singletonList(createShardingRuleConfiguration()), props ); } }同时项目中还有一个未经过 ShardingSphere 的原生 OceanBase 数据源Configuration public class DataSourceConfiguration { Bean(name logAnalysisDataSource) public DataSource logAnalysisDataSource() { // com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder // 使用 spring.datasource 配置来创建数据库连接池 DruidDataSource druidDataSource DruidDataSourceBuilder.create().build(); druidDataSource.setSocketTimeout(180000); druidDataSource.setConnectTimeout(180000); return druidDataSource; } }问题现象启动项目时发现Bean(shardingDataSource)所对应的 DruidDataSource 初始化时间特别长但Bean(name logAnalysisDataSource)所对应的 DruidDataSource 初始化却很快[2026-02-07 17:47:32.417] [INFO ] [com.zaxxer.hikari.HikariDataSource] [80] - [HikariPool-1 - Starting...] [2026-02-07 17:47:32.739] [INFO ] [com.zaxxer.hikari.HikariDataSource] [82] - [HikariPool-1 - Start completed.] [2026-02-07 17:50:22.107] [INFO ] [com.alibaba.druid.pool.DruidDataSource] [1007] - [{dataSource-1} inited] [2026-02-07 17:50:34.454] [INFO ] [com.alibaba.druid.pool.DruidDataSource] [1007] - [{dataSource-2} inited] [2026-02-07 17:50:35.840] [INFO ] [com.xxx.WebApplication] [61] - [Started WebApplication in 188.327 seconds (JVM running for 189.054)]日志中的 HikariDataSource 是 ShardingSphere JDBC 用于操作元数据的内部连接池其初始化完成至 DruidDataSource#init 执行前的耗时可忽略不计启动日志中{dataSource-1}对应Bean(shardingDataSource){dataSource-2}对应Bean(name logAnalysisDataSource)从日志可以看出Bean(shardingDataSource)这个 DruidDataSource 对象的初始化时间为 2 分 50 秒而Bean(name logAnalysisDataSource)这个 DruidDataSource 对象的初始化时间为 12 秒而两者唯一的区别在于底层 JDBC 驱动备注因项目开发环境位于内网且数据库部署于不同地域网络延迟较高数据库连接池初始化耗时 12 秒属正常范围跟踪 Druid 源码发现耗时主要集中在createPhysicalConnection()方法执行过程中该方法负责建立底层物理数据库连接public class DruidDataSource extends DruidAbstractDataSource implements DruidDataSourceMBean, ManagedDataSource, Referenceable, Closeable, Cloneable, ConnectionPoolDataSource, MBeanRegistration { public void init() throws SQLException { try { if (createScheduler ! null asyncInit) { for (int i 0; i initialSize; i) { submitCreateTask(true); } } else if (!asyncInit) { // init connections while (poolingCount initialSize) { try { // 慢在这里 PhysicalConnectionInfo pyConnectInfo createPhysicalConnection(); DruidConnectionHolder holder new DruidConnectionHolder(this, pyConnectInfo); connections[poolingCount] holder; } catch (SQLException ex) { } } } } finally { inited true; lock.unlock(); if (init LOG.isInfoEnabled()) { String msg {dataSource- this.getID(); if (this.name ! null !this.name.isEmpty()) { msg ,; msg this.name; } msg } inited; // 打印日志 LOG.info(msg); } } } }继续跟踪源码最终定位到问题源于 MySQL 驱动在创建连接时调用InetSocketAddress.getHostName()进行反向 DNS 解析耗时显著导致连接初始化缓慢完整的链路DruidAbstractDataSource#createPhysicalConnection ... com.mysql.cj.jdbc.ConnectionImpl#getInstance(HostInfo hostInfo)ConnectionImpl构造方法package com.mysql.cj.jdbc; public class ConnectionImpl implements JdbcConnection, SessionEventListener, Serializable { public ConnectionImpl(HostInfo hostInfo) throws SQLException { try { SocketAddress socketAddress this.session.getRemoteSocketAddress(); if (InetSocketAddress.class.isInstance(socketAddress)) { InetSocketAddress inetSocketAddress (InetSocketAddress) socketAddress; // 关键 this.connectionSpan.setAttribute( TelemetryAttribute.NETWORK_PEER_ADDRESS, // 获取 hostname 字段值 inetSocketAddress.getHostName() ); } } } }package java.net; public class InetSocketAddress extends SocketAddress { private final transient InetSocketAddressHolder holder; // Private implementation class pointed to by all public methods. private static class InetSocketAddressHolder { // The hostname of the Socket Address private String hostname; // The IP address of the Socket Address private InetAddress addr; // The port number of the Socket Address private int port; private InetSocketAddressHolder(String hostname, InetAddress addr, int port) { this.hostname hostname; this.addr addr; this.port port; } private int getPort() { return port; } private InetAddress getAddress() { return addr; } private String getHostName() { if (hostname ! null) return hostname; if (addr ! null) // ⚠️ 触发反向 DNS 解析内网无 DNS 服务 → 阻塞超时 return addr.getHostName(); return null; } } /** * Gets the {code hostname}. * Note: This method may trigger a name service reverse lookup if the * address was created with a literal IP address. * * return the hostname part of the address. */ public final String getHostName() { return holder.getHostName(); } }在网上搜了下有如下的文章片段# 解决 Linux 上 Java 获取 hostname 很慢的问题 在 Linux 环境中运行 Java 应用时有时会遇到 InetAddress.getLocalHost().getHostName() 方法执行缓慢的问题严重影响应用启动速度 ## 问题原因 Java 在调用 getHostName() 时会尝试对本机 IP 地址进行**反向 DNS 解析PTR 查询**以获取主机名若 DNS 服务器不可达、无 PTR 记录或网络延迟高该操作将长时间阻塞 ## 常见场景 - Docker / K8S 容器中未配置 DNS - 内部网络无反向解析支持 - 使用纯 IP 地址连接数据库如 MySQL真相大白我的项目开发环境位于公司内网完全无法访问外网更无外部 DNS 服务支持以下为尝试 ping 外网的输出结果$ ping www.baidu.com Ping 请求找不到主机 www.baidu.com。请检查该名称然后重试。那怎么解释Bean(name logAnalysisDataSource)这个 DruidDataSource 对象的初始化时间仅 12 秒呢这是因为它使用的是jdbc:oceanbase协议与oceanbase-client驱动这个驱动在连接建立过程中不会调用InetSocketAddress.getHostName()方法没看源码仅为猜测但八九不离十如何解决这个问题呢有如下两种方法网上说添加几个 JVM 参数就能解决实测无效上述问题在 SpringBoot 3 Druid 启动慢排查SpringBoot 启动慢、服务偶发接口慢查询MySQL Connector-j 9.0.0 版本问题getHostName() 请求慢 这篇文章中也提到了解决办法一修改 hosts 文件修改 hosts 文件添加域名映射10.xxx.xxx.146 www.define.com从启动日志可以看出问题完美解决[2026-02-07 18:44:04.258] [INFO ] [com.zaxxer.hikari.HikariDataSource] [80] - [HikariPool-1 - Starting...] [2026-02-07 18:44:04.582] [INFO ] [com.zaxxer.hikari.HikariDataSource] [82] - [HikariPool-1 - Start completed.] [2026-02-07 18:44:09.426] [INFO ] [com.alibaba.druid.pool.DruidDataSource] [1007] - [{dataSource-1} inited] [2026-02-07 18:44:22.180] [INFO ] [com.alibaba.druid.pool.DruidDataSource] [1007] - [{dataSource-2} inited] [2026-02-07 18:44:23.552] [INFO ] [com.xxx.WebApplication] [61] - [Started WebApplication in 24.191 seconds (JVM running for 24.92)]原理因InetAddress.getHostName()在本地 hosts 有映射时会跳过网络 DNS 查询从而避免阻塞解决办法二降低 MySQL 驱动版本降低至 8.0.33 版本实测有效dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version8.0.33/version /dependency从启动日志可以看出问题完美解决[2026-02-07 18:51:19.582] [INFO ] [com.zaxxer.hikari.HikariDataSource] [80] - [HikariPool-1 - Starting...] [2026-02-07 18:51:19.899] [INFO ] [com.zaxxer.hikari.HikariDataSource] [82] - [HikariPool-1 - Start completed.] [2026-02-07 18:51:24.718] [INFO ] [com.alibaba.druid.pool.DruidDataSource] [1007] - [{dataSource-1} inited] [2026-02-07 18:51:37.035] [INFO ] [com.alibaba.druid.pool.DruidDataSource] [1007] - [{dataSource-2} inited] [2026-02-07 18:51:38.433] [INFO ] [com.xxx.WebApplication] [61] - [Started WebApplication in 23.6 seconds (JVM running for 24.33)]翻看 8.0.33 中 ConnectionImpl 的源码不会调用InetSocketAddress.getHostName()方法

相关新闻

职业瓶颈想靠AI翻身?方向错了,学再多也是徒劳

职业瓶颈想靠AI翻身?方向错了,学再多也是徒劳

职场打拼三五年,许多人都会面临相似的困境:晋升遇阻、能力停滞,日常工作趋于机械重复。眼看身边有人似乎借助AI实现“快速成长”,自己也不免感到焦虑。于是跟风报名课程、学习教程,熟记大量AI提示词,练习各…

2026/5/17 3:26:15 阅读更多 →
【开题答辩全过程】以 高校新生军训管理系统为例,包含答辩的问题和答案

【开题答辩全过程】以 高校新生军训管理系统为例,包含答辩的问题和答案

个人简介 一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等 开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。 感谢大家…

2026/6/26 1:56:00 阅读更多 →
leetcode 929. Unique Email Addresses 独特的电子邮件地址

leetcode 929. Unique Email Addresses 独特的电子邮件地址

Problem: 929. Unique Email Addresses 独特的电子邮件地址 依次检查是否存在,若存在分割字符串,后缀检查长度>4且最后存在.com,前缀去掉和后续,去掉’.,检查前缀长度>0 Code class Solution { public:int num…

2026/6/20 13:42:01 阅读更多 →

最新新闻

斑马线检测数据集:智能交通与自动驾驶的关键资源

斑马线检测数据集:智能交通与自动驾驶的关键资源

1. 斑马线目标检测数据集概述这个斑马线目标检测数据集是专门为智能交通系统和自动驾驶领域设计的专业数据集,包含了1000张经过精细标注的道路场景图片。作为一名长期从事计算机视觉项目开发的工程师,我深知在目标检测任务中,一个高质量的数据…

2026/7/5 22:04:46 阅读更多 →
Claude 3.5 Sonnet实测:大模型选型与RAG落地关键技术解析

Claude 3.5 Sonnet实测:大模型选型与RAG落地关键技术解析

我不能按照该标题生成相关内容,原因如下: 标题中“史上最强模型”“一大批公司要倒闭了”属于明显夸大、煽动性表述,违反内容安全规范中“符合社会公序良俗与主流价值观”“确保表述安全、无歧义和误导”的强制要求; “Claude…

2026/7/5 22:04:46 阅读更多 →
大模型开源项目安全审计实战:从Llama-recipes漏洞分析到安全开发流水线构建

大模型开源项目安全审计实战:从Llama-recipes漏洞分析到安全开发流水线构建

1. 项目概述:为什么开源项目也需要安全审计?最近在社区里看到不少朋友在讨论大模型应用开发,尤其是基于 Meta 的 Llama 系列模型进行微调和部署。Llama-recipes 作为 Meta 官方推出的一个工具集,提供了从数据准备、模型微调到部署…

2026/7/5 22:02:45 阅读更多 →
YOLOv12对抗性特征增强训练原理与实战

YOLOv12对抗性特征增强训练原理与实战

1. YOLOv12与对抗性特征增强训练的背景解析YOLOv12作为2025年发布的注意力中心型物体检测器,其核心创新在于区域注意力机制(Area Attention)和R-ELAN架构。与传统CNN-based的YOLO系列不同,YOLOv12通过将特征图划分为多个水平或垂直…

2026/7/5 22:00:45 阅读更多 →
PatchMatchStereo 与 SGM 性能对比:Middlebury数据集上的5项指标实测

PatchMatchStereo 与 SGM 性能对比:Middlebury数据集上的5项指标实测

PatchMatchStereo与SGM立体匹配算法深度评测:Middlebury数据集5维性能对比1. 立体匹配算法技术背景与评测意义立体匹配作为计算机视觉三维重建的核心环节,其算法选择直接影响深度估计的精度与效率。在众多经典算法中,基于倾斜支持窗口的Patch…

2026/7/5 22:00:45 阅读更多 →
Gobuster字典工程实战:从基础配置到分层扫描策略

Gobuster字典工程实战:从基础配置到分层扫描策略

1. 项目概述:为什么你的Gobuster总是“刮痧”? 如果你做过Web目录或子域名枚举,大概率用过Gobuster。这个用Go语言写的工具,速度快、资源占用低,是渗透测试和漏洞赏金猎人武器库里的常客。但很多人用起来总觉得差点意思…

2026/7/5 22:00:45 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻