这个问题比较常见解决办法也有很多,但是我单独说下自己使用的那个方法: 集群环境下使用的数据库是共用的,我们可以通过创建表的唯一约束来做到并发控制调度任务。首先我们需要用到3张表 1.在数据库中建立itheima_job_group表 用来制定定时调度规则的表。分时间段来区别类型 Name Type Comments group_id number 组id interval number 时间间隔(设置定时任务间隔的时间,分为单位) remark varchar2(100) 描述字段 数据如下: group_id interval remark 1 1440 24小时调度一次 2 60 1小时调度一次 3 120 2小时调度一次 2.在数据库中建立 itheima_job表,用来存储用户需要定时调度任务的信息 Name Type Comments job_id number 定时任务id job_name varchar2(200) 定时任务名称 group_id number 定时任务所对应的规则表 remark varchar(100) 备注 数据如下: job_id job_name group_id remark 1 任务调度Job 1 每天16点执行 3.建立itheima_job_log表 此表就是用来控制任务调度次数的表。建立唯一索引 Name Type Comments log_id number 主键,自增 heima_job_id number 定时任务id heima_job_group number 定时任务所属的组 heima_job_start_ time date 执行时间 heima_job_status varchar2(10) 状态 执行情况 然后为itheima_job_log表添加如下的约束: create unique index heima_log_job on itheima_job_log(heima_job_id,decode(heima_job_group,1,to_char(heima_job_start_time,'yyyymmdd'),2,to_char(heima_job_start_time,'yyyymmddhh24'),3,trunc(to_char(heima_job_start_time,'yyyymmddhh24')/2)),TO_CHAR(JOB_START_TIME,'DD-MON-RR')) 1 当heima_job_group为1时,时间任务跨度为当天,此条记录是以当天时间作为唯一条件,当heima_job_group为2时,时间任务跨度为一小时内,不可存在两个相同的heima_job_id, heima_job_group为3时,在两个小时内不能出现同样的job_id. 时间比较的是heima_job_start_ time的时间间隔。 当程序在执行定时任务的情况下,先向表中插入一条数据,可以添加成功 当再执行如下操作时 ,因为存在唯一约束的原因会报错 我们在在代码中捕获到错误就不执行定时任务中的操作。 |