You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 1
  • countBookedByDate:SELECT COUNT(*) FROM bus_seat WHERE schedule_date = ? AND seat_status = 1
  • batchInsertNewSeats:循环生成1~30的座位编号,批量插入当日30条空座位记录

注意事项

  • 集群部署场景需要加分布式锁,可通过Redis SETNX 或数据库乐观锁实现,避免多节点重复执行任务插入重复数据
  • 建议给定时任务添加异常捕获和失败告警机制,避免座位生成失败影响正常业务
  • 测试阶段可将cron表达式修改为短间隔配置(例如0/5 * * * * ? 每5秒执行一次),验证逻辑正确后再替换为正式的每日执行配置

内容的提问来源于stack exchange,提问作者ARJUN SINGH LODHI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:24:02