一次达梦数据库“网络通信异常”的完整踩坑与解决记录

5 阅读1分钟

关键词:达梦数据库、DM JDBC、dynamic-datasource、HikariCP、Spring Boot


一、问题背景

在一个 Spring Boot 2.7 + MyBatis-Plus + dynamic-datasource 的新项目中,配置达梦数据库作为主库,启动时持续报错:

Caused by: java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine

完整异常最终都会落到:

com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: 网络通信异常

而令人非常困惑的是:

  • 同一台机器
  • 同一网络
  • 同一时间
  • 同一个达梦数据库
  • 另一个老项目完全可以正常连接

这让人非常容易误判为:

网络 / 防火墙 / VPN / 数据库端口 / 账号密码问题

但实际上,这些全都不是原因


二、最初的排查方向(全部是“伪线索”)

在排查过程中,依次验证并排除了以下问题:

  • ❌ 数据库是否启动(正常)
  • ❌ IP / 端口是否可达(ping、telnet 均正常)
  • ❌ JDBC URL 是否正确(已去除所有 MySQL 参数)
  • ❌ dynamic-datasource 是否生效(日志可见已创建 DataSource)
  • ❌ HikariCP / Spring Boot 配置问题

甚至将多数据源精简为 只保留一个达梦主库,问题依旧存在。

异常堆栈已经明确进入 达梦 JDBC 驱动内部

dm.jdbc.driver.DmdbConnection.openConnection

dm.jdbc.desc.EP.connect

dm.jdbc.desc.EPGroup.connect

这一步非常关键,它说明:

Spring、MyBatis、Hikari 都已经“把活干完了”, 问题只可能出在 JDBC 驱动本身。


三、真正的根因(核心结论)

❗ 问题根因并不是“达梦数据库连不上”,而是:

使用了“不兼容的达梦 JDBC 驱动发布版本”

新项目中最初使用的依赖是:

com.dameng

DmJdbcDriver18

8.1.2.xxx

runtime

而这个坐标对应的驱动,在以下场景中极其容易出问题:

  • Spring Boot + HikariCP
  • dynamic-datasource 启动即建池(Fail-Fast)
  • 达梦数据库版本较老 / 架构不一致

更致命的是:

一旦不兼容,它不会报“版本不匹配”,而是直接抛“网络通信异常”

这会严重误导排查方向。


四、为什么“另一个项目能连”?

答案很简单:

另一个项目,用的根本不是同一套 JDBC 驱动

在老项目中,实际使用的是来自达梦安装介质或私服的驱动:

com.dm

DmJdbcDriver18

1.8

虽然 artifactId 看起来一样,但:

  • com.damengcom.dm 并不是同一发布源
  • 内部实现差异很大
  • 兼容性完全不同

五、最终解决方案(一次性解决)

将 JDBC 驱动依赖 直接替换为稳定版本

com.dm

DmJdbcDriver18

1.8

其他配置 完全不需要改动,包括:

  • JDBC URL
  • dynamic-datasource
  • HikariCP
  • Spring Boot 版本

替换后:

  • 项目立即启动成功
  • 连接池正常初始化
  • 所有 Mapper 正常执行

六、这个坑为什么特别容易踩?

总结一下,这是一个非常典型但极具迷惑性的问题

  1. ❗ 异常信息是“网络通信异常”,但网络完全没问题
  2. ❗ 驱动 artifact 名称相同,实际实现不同
  3. ❗ 新版本 JDBC 反而兼容性更差
  4. ❗ 在多数据源 / 连接池场景下更容易暴雷

七、经验总结(强烈建议收藏)

国产数据库 = 工程经验优先于“官方最新”

  • ❌ 不要迷信“版本号更高更好”
  • ❌ 不要随意升级 JDBC 驱动
  • ✅ 能跑的版本,就是正确版本
  • ✅ 直接对齐“老项目 / 生产项目”的驱动来源

八、推荐做法(给未来的自己 / 同事)

  • 在项目 README 中 明确标注 JDBC 驱动来源与版本
  • 不要使用模糊的 ${dm.jdbc.version} 管理达梦驱动
  • 新项目优先复制“已稳定运行项目”的依赖配置

九、结语

这类问题,如果没有踩过,很难第一时间想到; 但一旦踩过一次,基本终身免疫

希望这篇记录,能帮你或你的同事 少掉几个小时甚至几天的排查时间