dameng_network_issue_solution.md 4.1 KB

达梦数据库网络通信异常解决方案

问题描述

应用启动时出现以下错误:

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. 验证数据库服务状态

    # 测试数据库服务器连通性
    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 中添加参数:

    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 监控截图
  • 数据库服务器版本信息
  • 网络拓扑结构
  • 问题发生的时间和频率