Springboot定时清理oracle指定表数据
定时清理oracle数据库 说明这是一个定时任务
java中实现定时任务的有:
- xxl-job 定时任务框架
- Quartz 强大的调度框架
- java.util.Timer
- ScheduledExecutorService (jdk自带的)
- Spring Task(Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz)
考虑到我使用的Springboot框架 引入别的框架会加大耦合度 这里使用spring task
在写具体的业务前我们先写一下配置类 这个类可以让后续任务走异步
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
@Configuration
@EnableAsync
public class AsyncConfig {
private int corePoolSize = 50;
private int maxPoolSize = 200;
private int queueCapacity = 50;
@Bean
public Executor taskExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.initialize();
return executor;
}
}
先介绍一下具体的几个注解
注解@Component将这个任务交给spring来管理
@Scheduled( cron = “0 0 22 ? * *”) 设置任务每天晚上10点进行执行
@Async 任务由一开始配置的线程池里异步执行 不会与后续其他任务冲突
@Transactional 事务管理
再介绍一下java 日期转化代表含义
yyyy:年
MM:月
dd:日
hh:1~12小时制(1-12)
HH:24小时制(0-23)
mm:分
ss:秒
S:毫秒
E:星期几
D:一年中的第几天
F:一月中的第几个星期(会把这个月总共过的天数除以7)
w:一年中的第几个星期
W:一月中的第几星期(会根据实际情况来算)
a:上下午标识
k:和HH差不多,表示一天24小时制(1-24)。
K:和hh差不多,表示一天12小时制(0-11)。
z:表示时区
接下来就是我们的业务代码
@Component
public class ScheduledService {
@Autowired
private ReqrespMapper reqrespMapper;
@Scheduled( cron = "0 0 22 ? * *")
@Async
@Transactional(rollbackFor = Exception.class)
public void databaseCleanTask()
{
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMdd-HH:mm:ss");
Calendar c= Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.DATE);
Date time = c.getTime();
String curretnTimeFormat = simpleDateFormat.format(time);
reqrespMapper.deleteByTime(curretnTimeFormat);
}
}
oracle数据库中根据时间删除数据的命令
delete 表名 where 时间字段 < to_date(‘20220520-13:58:38’,‘yyyyMMdd-HH24:mi:ss’)
’20220520-13:58:38‘是我们从java转化出来的字符串 必须是这种格式
最后一下Mapper内容怎么写
#{curretnTimeFormat} 记得替换成 你的数据
<; 是小于号的转义
<delete id="deleteByTime">
delete 数据库表名
<where>
数据库时间字段 < to_date(#{curretnTimeFormat},'yyyyMMdd-HH24:mi:ss')
</where>
</delete>
当程序在运行时 每天晚上10点会执行这个任务 删除10点之前的对应表的所有数据
|