Spring Boot如何在凌晨12:01向SQL数据库定时插行实现公交票务座位重置
Spring Boot 公交订票系统每日座位重置实现方案
前置配置
首先在Spring Boot启动类上添加@EnableScheduling注解,开启框架自带的定时任务能力:
@SpringBootApplication @EnableScheduling public class BusTicketApplication { public static void main(String[] args) { SpringApplication.run(BusTicketApplication.class, args); } }
数据库表设计参考
建议新增带运营日期标识的座位表,避免修改历史订单关联的座位数据,核心字段如下:
- 主键id
- bus_id 关联公交线路id
- seat_no 座位编号(1~30)
- seat_status 座位状态:0=未预订,1=已预订
- schedule_date 运营日期(区分不同日期的座位数据)
- create_time 记录创建时间
建议给schedule_date字段加索引,提升统计、查询效率
定时任务代码实现
新增定时任务组件,配置cron表达式为每天凌晨00:01执行,业务逻辑按需求实现即可:
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.beans.factory.annotation.Autowired; import java.time.LocalDate; @Component public class SeatResetTask { @Autowired private BusSeatService busSeatService; // cron表达式含义:秒 分 时 日 月 周 年(可选),当前配置为每天00:01:00执行 @Scheduled(cron = "0 1 0 * * ?") public void resetDailySeats() { LocalDate yesterday = LocalDate.now().minusDays(1); LocalDate today = LocalDate.now(); // 幂等校验:当日座位已生成则直接返回,避免重复插入 if (busSeatService.existsByScheduleDate(today)) { return; } // 统计前一天已预订的座位总数 int bookedCount = busSeatService.countBookedByDate(yesterday); // 满足前一天预订≥25张的条件,批量生成当日空座位 if (bookedCount >= 25) { // 批量插入30条座位记录,seat_status默认值为0(未预订) busSeatService.batchInsertNewSeats(today, 30); } // 可选逻辑:如果未达到25张预订量,可在此处复用上一日未预订的座位数据 // else { // busSeatService.copyUnbookedSeats(yesterday, today); // } } }
上述代码中依赖的Service方法对应核心SQL参考:
existsByScheduleDate:SELECT COUNT(*) FROM bus_seat WHERE schedule_date = ? LIMIT 1countBookedByDate:SELECT COUNT(*) FROM bus_seat WHERE schedule_date = ? AND seat_status = 1batchInsertNewSeats:循环生成1~30的座位编号,批量插入当日30条空座位记录
注意事项
- 集群部署场景需要加分布式锁,可通过Redis
SETNX或数据库乐观锁实现,避免多节点重复执行任务插入重复数据 - 建议给定时任务添加异常捕获和失败告警机制,避免座位生成失败影响正常业务
- 测试阶段可将cron表达式修改为短间隔配置(例如
0/5 * * * * ?每5秒执行一次),验证逻辑正确后再替换为正式的每日执行配置
内容的提问来源于stack exchange,提问作者ARJUN SINGH LODHI
相关产品推荐
相关产品推荐

