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

## 问题描述

应用启动时出现以下错误：
```
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 监控截图
- 数据库服务器版本信息
- 网络拓扑结构
- 问题发生的时间和频率
