# 达梦数据库网络通信异常解决方案 ## 问题描述 应用启动时出现以下错误: ``` Caused by: dm.jdbc.driver.DMException: 网络通信异常 Caused by: java.io.EOFException ``` 错误发生在 `SysDictTypeServiceImpl.init()` 方法初始化字典缓存时。 ## 已实施的解决方案 ### 1. 优化 Druid 连接池配置 **修改文件:** `gw-admin/src/main/resources/application-druid.yml` **关键调整:** - ✅ 增加连接超时时间:30s → 60s - ✅ 增加网络超时时间:60s → 120s - ✅ 缩短空闲连接检测间隔:60s → 30s(更频繁地检测失效连接) - ✅ 缩短连接最小生存时间:300s → 180s - ✅ 缩短连接最大生存时间:900s → 600s - ✅ 启用获取连接时测试:testOnBorrow: true(确保获取的连接有效) - ✅ 启用泄漏连接回收:removeAbandoned: true - ✅ 设置泄漏回收超时:300秒 - ✅ 开启泄漏日志:logAbandoned: true ### 2. 添加启动重试机制 **修改文件:** `gw-system/src/main/java/com/goldenwater/system/service/impl/SysDictTypeServiceImpl.java` **功能说明:** - 在应用启动时,如果数据库连接失败,会自动重试最多3次 - 每次重试间隔递增:第一次2秒,第二次4秒,第三次6秒 - 避免因启动瞬间网络波动导致的应用启动失败 ### 3. 增强异常处理 **修改内容:** - 在 `loadingDictCache()` 方法中添加 try-catch 保护 - 提供更清晰的错误信息 - 确保空值检查,避免 NPE ## 其他建议方案 ### 方案A:检查网络连接 1. **验证数据库服务状态** ```bash # 测试数据库服务器连通性 ping 39.98.38.2 # 测试数据库端口连通性 telnet 39.98.38.2 30236 ``` 2. **检查防火墙规则** - 确保防火墙没有阻止 30236 端口 - 检查是否有中间网络设备(如负载均衡器)断开空闲连接 3. **检查数据库服务器负载** - CPU、内存使用率是否正常 - 连接数是否达到上限 ### 方案B:更新达梦数据库驱动 如果当前使用的达梦驱动版本较老,建议升级到最新稳定版: 1. 查看当前驱动版本(在 pom.xml 中) 2. 从达梦官网下载最新驱动 3. 替换项目中的 dm-jdbc 驱动包 ### 方案C:调整数据库服务器配置 联系 DBA 检查达梦数据库服务器配置: - `MAX_SESSIONS` - 最大会话数 - `CONNECT_TIMEOUT` - 连接超时设置 - `KEEP_ALIVE` - 保持活动连接配置 ### 方案D:使用连接保活机制 如果问题持续存在,可以考虑: 1. **在 JDBC URL 中添加参数:** ```yaml url: jdbc:dm://39.98.38.2:30236?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8&schema=TBA_HZZ&connectTimeout=60000&socketTimeout=120000 ``` 2. **启用 TCP KeepAlive:** 在操作系统层面启用 TCP KeepAlive 以防止防火墙断开空闲连接 ## 监控和诊断 ### 1. 启用 Druid 监控 访问 Druid 监控页面:`http://localhost:8080/druid/` - 用户名:goldenwater - 密码:123456 查看: - 连接池活跃连接数 - 连接泄漏情况 - SQL 执行统计 - 慢查询记录 ### 2. 查看应用日志 关注以下日志信息: - 连接池初始化日志 - 连接获取/释放日志 - 数据库异常堆栈 ### 3. 网络抓包分析(必要时) 如果问题依然存在,可以使用 Wireshark 或 tcpdump 进行网络抓包,分析 TCP 连接断开的具体原因。 ## 快速验证 重启应用后,观察: 1. ✅ 应用是否能正常启动 2. ✅ 控制台是否有 "加载字典缓存失败" 的错误 3. ✅ 访问系统功能是否正常 4. ✅ Druid 监控页面显示的连接池状态是否正常 ## 预防措施 1. **定期检查数据库连接状态** 2. **监控连接池使用情况** 3. **设置合理的超时和重试策略** 4. **保持数据库驱动为最新稳定版本** 5. **定期维护数据库服务器和网络设备** ## 联系支持 如果以上方案都无法解决问题,请提供: - 完整的应用启动日志 - Druid 监控截图 - 数据库服务器版本信息 - 网络拓扑结构 - 问题发生的时间和频率