问题背景:
在数据清理定时任务中,发现理应被删除的数据未被正确清理。
经排查发现:
- 定时任务配置在每日00:00:00执行
- 删除数据SQL语句逻辑正常
- 应用服务器时间准确
- 数据库服务器时间比应用服务器慢15秒
- 数据清理SQL使用CURDATE()获取当前日期
问题原因分析:
当应用服务器在00:00:00触发任务时:
- 应用服务器时间:2025-07-18 00:00:00
- 数据库服务器时间:2025-07-17 23:59:45(滞后15秒)
- SQL中CURDATE()返回:2025-07-17(而非预期的2025-07-18)
- 数据清理条件计算为DATE_SUB(‘2025-07-17’, INTERVAL 12 MONTH)
- 实际应计算为DATE_SUB(‘2025-07-18’, INTERVAL 12 MONTH)
解决方案:
应用层传递时间参数
// Service层
public Long cleanExpiredRecords() {
// 使用应用服务器时间
Date currentDate = new Date();
return recordMapper.deleteExpiredRecords(currentDate);
}
// Mapper接口
@Delete("DELETE FROM data_records " +
"WHERE update_time < DATE_SUB(#{currentDate}, INTERVAL 12 MONTH)")
Long deleteExpiredRecords(@Param("currentDate") Date currentDate);