关键词:达梦数据库、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.dameng与com.dm并不是同一发布源- 内部实现差异很大
- 兼容性完全不同
五、最终解决方案(一次性解决)
将 JDBC 驱动依赖 直接替换为稳定版本:
com.dm
DmJdbcDriver18
1.8
其他配置 完全不需要改动,包括:
- JDBC URL
- dynamic-datasource
- HikariCP
- Spring Boot 版本
替换后:
- 项目立即启动成功
- 连接池正常初始化
- 所有 Mapper 正常执行
六、这个坑为什么特别容易踩?
总结一下,这是一个非常典型但极具迷惑性的问题:
- ❗ 异常信息是“网络通信异常”,但网络完全没问题
- ❗ 驱动 artifact 名称相同,实际实现不同
- ❗ 新版本 JDBC 反而兼容性更差
- ❗ 在多数据源 / 连接池场景下更容易暴雷
七、经验总结(强烈建议收藏)
国产数据库 = 工程经验优先于“官方最新”
- ❌ 不要迷信“版本号更高更好”
- ❌ 不要随意升级 JDBC 驱动
- ✅ 能跑的版本,就是正确版本
- ✅ 直接对齐“老项目 / 生产项目”的驱动来源
八、推荐做法(给未来的自己 / 同事)
- 在项目 README 中 明确标注 JDBC 驱动来源与版本
- 不要使用模糊的
${dm.jdbc.version}管理达梦驱动 - 新项目优先复制“已稳定运行项目”的依赖配置
九、结语
这类问题,如果没有踩过,很难第一时间想到; 但一旦踩过一次,基本终身免疫。
希望这篇记录,能帮你或你的同事 少掉几个小时甚至几天的排查时间。