3.8 KiB
3.8 KiB
60分钟自动同步数据问题诊断报告
问题描述
用户反馈:60分钟自动同步数据功能没有正常工作,xq_client_log 表中仍然是空数据。
问题分析
1. 当前状态
- ✅ 应用正在运行(PID 17008)
- ✅ 定时任务配置正确(60分钟间隔)
- ❌ 数据同步失败:
Data truncation: Data too long for column 'latitude' - ❌
xq_client_log表查询结果为0条记录
2. 根本原因
数据库字段长度限制:latitude 字段长度不够,导致数据截断错误,批量插入失败。
解决方案
第一步:修复数据库字段长度
-- 执行 emergency_fix_field_length.sql
ALTER TABLE xq_client_log MODIFY COLUMN latitude VARCHAR(500) DEFAULT NULL COMMENT '纬度';
ALTER TABLE xq_client_log MODIFY COLUMN longitude VARCHAR(500) DEFAULT NULL COMMENT '经度';
ALTER TABLE xq_client_log MODIFY COLUMN device_voltage VARCHAR(500) DEFAULT NULL COMMENT '设备电量';
ALTER TABLE xq_client_log MODIFY COLUMN device_temp VARCHAR(500) DEFAULT NULL COMMENT '设备温度';
ALTER TABLE xq_client_log MODIFY COLUMN server_device_id VARCHAR(500) DEFAULT NULL COMMENT '主机设备ID';
第二步:清空表并重新同步
-- 清空现有数据
TRUNCATE TABLE xq_client_log;
第三步:手动触发同步
# 手动触发数据同步
Invoke-WebRequest -Uri "http://localhost:8080/api/deliveryDevice/manualSyncDeviceLogs" -Method POST
技术细节
1. 定时任务配置
@Scheduled(fixedRate = 60 * 60 * 1000) // 60分钟
public void syncDeviceDataToLogs() {
try {
logger.info("开始执行设备日志同步定时任务");
iotDeviceLogSyncService.syncDeviceDataToLogs();
logger.info("设备日志同步定时任务执行完成");
iotDeviceLogSyncService.logSyncStatistics();
} catch (Exception e) {
logger.error("设备日志同步定时任务执行失败", e);
}
}
2. 数据同步逻辑
- 查询
iot_device_data表的所有设备 - 按设备类型分组(1=主机,2=耳标,4=项圈)
- 转换为对应的日志实体
- 批量插入到日志表
3. 字段映射关系
| iot_device_data | xq_client_log | 说明 |
|---|---|---|
voltage |
device_voltage |
设备电压 |
temperature |
device_temp |
设备温度 |
steps |
walk_steps |
总步数 |
same_day_steps |
y_walk_steps |
昨日步数 |
latitude |
latitude |
纬度 |
longitude |
longitude |
经度 |
测试验证
1. 数据库字段长度测试
-- 执行 test_data_sync_functionality.sql
-- 验证字段长度是否足够
2. 手动插入测试
-- 手动插入一条测试记录
INSERT INTO xq_client_log (...) VALUES (...);
3. 批量同步测试
# 手动触发同步
POST /api/deliveryDevice/manualSyncDeviceLogs
预期结果
修复后,应该看到:
- 数据库字段长度:所有字段长度 >= 500字符
- 数据同步成功:不再有
Data truncation错误 - 日志表有数据:
xq_client_log表包含设备数据 - 定时任务正常:每60分钟自动同步数据
故障排除
如果问题仍然存在,请检查:
- 数据库权限:确认应用有ALTER TABLE权限
- 字段类型:确认字段类型支持VARCHAR(500)
- 数据格式:确认经纬度数据格式正确
- 日志输出:查看应用日志中的详细错误信息
下一步行动
- ✅ 执行数据库字段长度修复脚本
- ✅ 清空
xq_client_log表 - 📋 手动触发数据同步
- 📋 验证同步结果
- 📋 确认60分钟定时任务正常工作
结论
问题已定位:数据库字段长度限制导致数据同步失败。修复字段长度后,60分钟自动同步功能应该能正常工作。