发表于: 2019-12-17 21:03:54
1 1359
一、今天完成的事
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
评论