发表于: 2019-12-17 21:03:54

1 1358


一、今天完成的事

1.学习quartz

执行定时清除表数据

mapper中加入

  /**
    * 清空签到表
    * @return
    */
   @Delete("truncate table student_checkin")
   boolean cleanTable();

新建JobClean类

@Configuration
@EnableScheduling
public class JobClean {

   @Autowired
   CheckinService checkinService;

   @Scheduled(cron = "0/5 * * * * ? ")
   public void runner(){
    boolean status = checkinService.cleanTable();
       System.out.println(status);
   }

}

其中:

  • @Configuration用于定义这是一个配置类

  • @EnableScheduling开启springboot自带的定时任务功能

  • @Scheduled(cron="")设置这个方法为调度任务

    注:cron表达式

    {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
    • “*”字符代表所有可能的值。“*”在{月份}里表示每个月的含义。

    • “/”字符用来指定数值的增量。 在{分钟} 里的“0/15”表示从第0分钟开始,每15分钟。 在{分钟}里的“3/20”表示从第3分钟开始,每20分钟(它和“3,23,43”)的含义一样。

    • “L” 字符仅被用于{日期}和{星期},它是单词“last”的缩写。 在{日期},“L”表示一个月的最后一天。 在{星期},“L”表示一个星期的最后一天,也就是SAT。

    • 如果在“L”前有具体的内容,它就具有其他的含义了。 “6L”表示这个月的倒数第6天,“FRIL”表示这个月的最一个星期五。 注意:在使用“L”参数时,不要指定列表或范围,

    • 由于{日期}和{星期}这两个元素互斥的, 其中之一被指定了值以后, 必须要对另一个设为”?”。

    • “*” 代表每隔1秒钟触发。

      “,” 代表在指定的秒数触发。比如”0,15,45”代表0秒、15秒和45秒时触发任务。

      “-“代表在指定的范围内触发,比如”25-45”代表从25秒开始触发到45秒结束触发,每隔1秒触发1次。

      {小时} ==> 允许值范围: 0~23 ,不允许为空值,若值不合法。占位符和秒数一样。
      {日期} ==> 允许值范围: 1~31 ,不允许为空值。
      {月份} ==> 允许值范围: 0~11
      {星期} ==> 允许值范围: 1~7 (或 SUN,MON,TUE,WED,THU,FRI,SAT), 1代表星期天(SUN),以此类推,7代表星期六(SAT),不允许为空值。
      {年份} ==> 允许值范围: 1970~2099 ,允许为空。

cron表达式可以在   http://qqe2.com/cron中自动生成

附:@Scheduled注解中8个参数

1. cron

该参数接收一个cron表达式,cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。

2.zone

时区,接收一个java.util.TimeZone#ID。cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai。该字段我们一般留空。

3. fixedDelay

上一次执行完毕时间点之后多长时间再执行。如:

@Scheduled(fixedDelay = 5000) //上一次执行完毕时间点之后5秒再执行

4. fixedDelayString

与 3. fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。如:

@Scheduled(fixedDelayString = "5000") //上一次执行完毕时间点之后5秒再执行

5. fixedRate

上一次开始执行时间点之后多长时间再执行。如:

@Scheduled(fixedRate = 5000) //上一次开始执行时间点之后5秒再执行

6. fixedRateString

与 5. fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

7. initialDelay

第一次延迟多长时间后再执行。如:

@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次

8. initialDelayString

与 7. initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

运行之后,因为这里设置的5秒执行一次,所以五秒就会打印一次状态


修改cron为本月最后一天

cron=“0 0 0 1 * ? *”

利用工具查看最后10次运行时间

和预想一致

二、遇到的问题

三、收获

1.清空数据表

(1)drop:

  • sql语句:

    drop table 表名

  • 解释:

    删除内容和定义,释放空间。简单来说就是把整个表去掉,以后要新增数据是不可能的,除非新增一个表

  • 注意:

    drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。

(2)truncate

  • sql语句:

    truncate table 表名

  • 解释:

    删除内容、释放空间但不删除定义、与drop不同的是,他只是清空表数据而已。

  • 注意:

    truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器。

(3)delete

  • sql语句:

    delete from 表名

  • 注意: 1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。

    2、delete可根据条件删除表中满足条件的数据,如果不指定where子句,那么删除表中所有记录。

    3、delete语句不影响表所占用的extent,高水线(high watermark)保持原位置不变。

总结:

  • 1、在速度上,一般来说,drop> truncate > delete。

  • 2、在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。

  • 3、如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;

    如果想删除表,当然用drop;

    如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;

    如果和事务有关,或者想触发trigger,还是用delete;

    如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据。

四、明天的计划

看看明天有没有出现什么bug



返回列表 返回列表
评论

    分享到