3

Springboot如何定时清理oracle指定表数据

 1 year ago
source link: https://www.huhexian.com/45882.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Springboot如何定时清理oracle指定表数据

青山 2022-05-2710:31:35评论

本文将通过示例介绍Springboot定时清理oracle指定表数据,定时清理oracle数据库说明这是一个定时任务,那么我们应该如何实现呢?

Springboot如何定时清理oracle指定表数据

java中实现定时任务的有:

  • xxl-job 定时任务框架
  • Quartz 强大的调度框架
  • java.util.Timer
  • ScheduledExecutorService (jdk自带的)
  • Spring Task(Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz)

考虑到我使用的Springboot框架 引入别的框架会加大耦合度 这里使用spring task

在写具体的业务前我们先写一下配置类 这个类可以让后续任务走异步

  1. import org.springframework.context.annotation.Bean;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.scheduling.annotation.EnableAsync;
  4. import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
  5. import java.util.concurrent.Executor;
  6. @Configuration
  7. @EnableAsync
  8. public class AsyncConfig {
  9. /**
  10. 此处成员变量应该使用@Value从配置中读取
  11. */
  12. private int corePoolSize = 50;
  13. private int maxPoolSize = 200;
  14. private int queueCapacity = 50;
  15. @Bean
  16. public Executor taskExecutor(){
  17. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  18. executor.setCorePoolSize(corePoolSize);
  19. executor.setMaxPoolSize(maxPoolSize);
  20. executor.setQueueCapacity(queueCapacity);
  21. executor.initialize();
  22. return executor;
  23. }
  24. }

先介绍一下具体的几个注解

注解@Component将这个任务交给spring来管理

@Scheduled( cron = “0 0 22 ? * *”) 设置任务每天晚上10点进行执行

@Async 任务由一开始配置的线程池里异步执行 不会与后续其他任务冲突

@Transactional 事务管理

再介绍一下java 日期转化代表含义

  1. yyyy:年
  2. MM:月
  3. dd:日
  4. hh:1~12小时制(1-12)
  5. HH:24小时制(0-23)
  6. mm:分
  7. ss:秒
  8. S:毫秒
  9. E:星期几
  10. D:一年中的第几天
  11. F:一月中的第几个星期(会把这个月总共过的天数除以7)
  12. w:一年中的第几个星期
  13. W:一月中的第几星期(会根据实际情况来算)
  14. a:上下午标识
  15. k:和HH差不多,表示一天24小时制(1-24)。
  16. K:和hh差不多,表示一天12小时制(0-11)。
  17. z:表示时区

接下来就是我们的业务代码

  1. @Component
  2. public class ScheduledService {
  3. @Autowired
  4. private ReqrespMapper reqrespMapper;//这里是我要操作具体的表使用的mapper
  5. //每天晚上10点触发一次
  6. @Scheduled( cron = "0 0 22 ? * *")
  7. @Async
  8. @Transactional(rollbackFor = Exception.class)
  9. public void databaseCleanTask()
  10. {
  11. //设置日期转化格式
  12. SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyyMMdd-HH:mm:ss");
  13. Calendar c= Calendar.getInstance();
  14. c.setTime(new Date());
  15. c.add(Calendar.DATE);
  16. Date time = c.getTime();//获取当当天日期
  17. String curretnTimeFormat = simpleDateFormat.format(time);
  18. reqrespMapper.deleteByTime(curretnTimeFormat);
  19. }
  20. }

oracle数据库中根据时间删除数据的命令

delete 表名 where 时间字段 < to_date(‘20220520-13:58:38’,‘yyyyMMdd-HH24:mi:ss’)

’20220520-13:58:38‘是我们从java转化出来的字符串 必须是这种格式

最后一下Mapper内容怎么写

#{curretnTimeFormat} 记得替换成 你的数据

&lt; 是小于号的转义

  1. <delete id="deleteByTime">
  2. delete 数据库表名
  3. <where>
  4. 数据库时间字段< to_date(#{curretnTimeFormat},'yyyyMMdd-HH24:mi:ss')
  5. </where>
  6. </delete>

当程序在运行时 每天晚上10点会执行这个任务 删除10点之前的对应表的所有数据


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK