Commit c66b4e7bc0e0beb8a41dac39cb096114c140c233

Authored by YunaiV
1 parent 1bc1be14

code review:日志清理 Job

Showing 13 changed files with 91 additions and 132 deletions
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/job/JobLogMapper.java
... ... @@ -9,9 +9,8 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO;
9 9 import org.apache.ibatis.annotations.Delete;
10 10 import org.apache.ibatis.annotations.Mapper;
11 11 import org.apache.ibatis.annotations.Param;
12   -import org.apache.ibatis.annotations.Update;
13 12  
14   -import java.util.Date;
  13 +import java.time.LocalDateTime;
15 14 import java.util.List;
16 15  
17 16 /**
... ... @@ -44,19 +43,14 @@ public interface JobLogMapper extends BaseMapperX<JobLogDO> {
44 43 );
45 44 }
46 45  
47   - // 另外,timingJobCleanLog 的具体 sql 这么写,性能是比较差的;可以直接 delete * from job_log where create_time < xxx order by id limit 100;
48   -
49 46 /**
50   - * 目前物理删除只能通过mybatis-plus的注解实现 or mybatis的xml实现
51   - * 如果写xml的话就需要多写一个映射类
  47 + * 物理删除指定时间之前的日志
52 48 *
53   - * @param jobCleanRetainDay 时间限制
54   - * @param deleteLimit 删除次数的限制
55   - * @return
  49 + * @param createTime 最大时间
  50 + * @param limit 删除条数,防止一次删除太多
  51 + * @return 删除条数
56 52 */
57   - @Delete("DELETE FROM infra_job_log WHERE create_time < #{jobCleanRetainDay} LIMIT #{deleteLimit}")
58   - Integer deleteByCreateTimeLt(@Param("jobCleanRetainDay") Date jobCleanRetainDay,@Param("deleteLimit")Integer deleteLimit);
  53 + @Delete("DELETE FROM infra_job_log WHERE create_time < #{createTime} LIMIT #{limit}")
  54 + Integer deleteByCreateTimeLt(@Param("createTime") LocalDateTime createTime, @Param("limit") Integer limit);
59 55  
60   - @Update("ALTER TABLE infra_job_log FORCE")
61   - void optimizeTable();
62 56 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiAccessLogMapper.java
... ... @@ -9,9 +9,8 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiAccessLogDO;
9 9 import org.apache.ibatis.annotations.Delete;
10 10 import org.apache.ibatis.annotations.Mapper;
11 11 import org.apache.ibatis.annotations.Param;
12   -import org.apache.ibatis.annotations.Update;
13 12  
14   -import java.util.Date;
  13 +import java.time.LocalDateTime;
15 14 import java.util.List;
16 15  
17 16 /**
... ... @@ -49,16 +48,13 @@ public interface ApiAccessLogMapper extends BaseMapperX&lt;ApiAccessLogDO&gt; {
49 48 }
50 49  
51 50 /**
52   - * 目前物理删除只能通过mybatis-plus的注解实现 or mybatis的xml实现
53   - * 如果写xml的话就需要多写一个映射类
  51 + * 物理删除指定时间之前的日志
54 52 *
55   - * @param accessLogExceedDay 时间限制
56   - * @param deleteLimit 删除次数的限制
57   - * @return
  53 + * @param createTime 最大时间
  54 + * @param limit 删除条数,防止一次删除太多
  55 + * @return 删除条数
58 56 */
59   - @Delete("DELETE FROM infra_api_access_log WHERE create_time < #{accessLogExceedDay} LIMIT #{deleteLimit}")
60   - Integer deleteByCreateTimeLt(@Param("accessLogExceedDay") Date accessLogExceedDay,@Param("deleteLimit")Integer deleteLimit);
  57 + @Delete("DELETE FROM infra_api_access_log WHERE create_time < #{createTime} LIMIT #{limit}")
  58 + Integer deleteByCreateTimeLt(@Param("createTime") LocalDateTime createTime, @Param("limit") Integer limit);
61 59  
62   - @Update("ALTER TABLE infra_api_access_log FORCE")
63   - void optimizeTable();
64 60 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/logger/ApiErrorLogMapper.java
... ... @@ -9,9 +9,8 @@ import cn.iocoder.yudao.module.infra.dal.dataobject.logger.ApiErrorLogDO;
9 9 import org.apache.ibatis.annotations.Delete;
10 10 import org.apache.ibatis.annotations.Mapper;
11 11 import org.apache.ibatis.annotations.Param;
12   -import org.apache.ibatis.annotations.Update;
13 12  
14   -import java.util.Date;
  13 +import java.time.LocalDateTime;
15 14 import java.util.List;
16 15  
17 16 /**
... ... @@ -47,16 +46,13 @@ public interface ApiErrorLogMapper extends BaseMapperX&lt;ApiErrorLogDO&gt; {
47 46 }
48 47  
49 48 /**
50   - * 目前物理删除只能通过mybatis-plus的注解实现 or mybatis的xml实现
51   - * 如果写xml的话就需要多写一个映射类
  49 + * 物理删除指定时间之前的日志
52 50 *
53   - * @param errorLogExceedDay 时间限制
54   - * @param deleteLimit 删除次数的限制
55   - * @return
  51 + * @param createTime 最大时间
  52 + * @param limit 删除条数,防止一次删除太多
  53 + * @return 删除条数
56 54 */
57   - @Delete("DELETE FROM infra_api_error_log WHERE create_time < #{errorLogExceedDay} LIMIT #{deleteLimit}")
58   - Integer deleteByCreateTimeLt(@Param("errorLogExceedDay") Date errorLogExceedDay,@Param("deleteLimit")Integer deleteLimit);
  55 + @Delete("DELETE FROM infra_api_error_log WHERE create_time < #{createTime} LIMIT #{limit}")
  56 + Integer deleteByCreateTimeLt(@Param("createTime") LocalDateTime createTime, @Param("limit")Integer limit);
59 57  
60   - @Update("ALTER TABLE infra_api_error_log FORCE")
61   - void optimizeTable();
62 58 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/job/AccessLogCleanRecordJob.java renamed to yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/job/job/AccessLogCleanJob.java
1   -package cn.iocoder.yudao.module.infra.job;
  1 +package cn.iocoder.yudao.module.infra.job.job;
2 2  
3 3 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
4 4 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
... ... @@ -9,33 +9,33 @@ import org.springframework.stereotype.Component;
9 9 import javax.annotation.Resource;
10 10  
11 11 /**
12   - * 定时 物理 删除访问日志的 Job
  12 + * 物理删除 N 天前的访问日志的 Job
13 13 *
14   - * @author: j-sentinel
  14 + * @author j-sentinel
15 15 */
16   -@Slf4j
17 16 @Component
18   -public class AccessLogCleanRecordJob implements JobHandler {
  17 +@Slf4j
  18 +public class AccessLogCleanJob implements JobHandler {
19 19  
20 20 @Resource
21 21 private ApiAccessLogService apiAccessLogService;
22 22  
23 23 /**
24   - * 清理超过(7)天的日志
  24 + * 清理超过(14)天的日志
25 25 */
26   - private static final Integer JOB_CLEAN_RETAIN_DAY = 7;
  26 + private static final Integer JOB_CLEAN_RETAIN_DAY = 14;
27 27  
28 28 /**
29   - * 每次删除间隔的条数,如果值太高可能会造成数据库的宕机
  29 + * 每次删除间隔的条数,如果值太高可能会造成数据库的压力过大
30 30 */
31 31 private static final Integer DELETE_LIMIT = 100;
32 32  
33 33 @Override
34 34 @TenantIgnore
35   - public String execute(String param) throws Exception {
36   - Integer integer = apiAccessLogService.jobCleanAccessLog(JOB_CLEAN_RETAIN_DAY,DELETE_LIMIT);
37   - log.info("定时执行清理访问日志数量({})个", integer);
38   - return String.format("定时执行清理错误日志数量 %s 个", integer);
  35 + public String execute(String param) {
  36 + Integer count = apiAccessLogService.cleanAccessLog(JOB_CLEAN_RETAIN_DAY, DELETE_LIMIT);
  37 + log.info("[count][定时执行清理访问日志数量 ({}) 个]", count);
  38 + return String.format("定时执行清理错误日志数量 %s 个", count);
39 39 }
40 40  
41 41 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/job/ErrorLogCleanRecordJob.java renamed to yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/job/job/ErrorLogCleanJob.java
1   -package cn.iocoder.yudao.module.infra.job;
  1 +package cn.iocoder.yudao.module.infra.job.job;
2 2  
3 3 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
4 4 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
5   -import cn.iocoder.yudao.module.infra.service.logger.ApiAccessLogService;
6 5 import cn.iocoder.yudao.module.infra.service.logger.ApiErrorLogService;
7 6 import lombok.extern.slf4j.Slf4j;
8 7 import org.springframework.stereotype.Component;
... ... @@ -10,33 +9,33 @@ import org.springframework.stereotype.Component;
10 9 import javax.annotation.Resource;
11 10  
12 11 /**
13   - * 定时 物理 删除错误日志的 Job
  12 + * 物理删除 N 天前的错误日志的 Job
14 13 *
15   - * @author: j-sentinel
  14 + * @author j-sentinel
16 15 */
17 16 @Slf4j
18 17 @Component
19   -public class ErrorLogCleanRecordJob implements JobHandler {
  18 +public class ErrorLogCleanJob implements JobHandler {
20 19  
21 20 @Resource
22 21 private ApiErrorLogService apiErrorLogService;
23 22  
24 23 /**
25   - * 清理超过(7)天的日志
  24 + * 清理超过(14)天的日志
26 25 */
27   - private static final Integer JOB_CLEAN_RETAIN_DAY = 7;
  26 + private static final Integer JOB_CLEAN_RETAIN_DAY = 14;
28 27  
29 28 /**
30   - * 每次删除间隔的条数,如果值太高可能会造成数据库的宕机
  29 + * 每次删除间隔的条数,如果值太高可能会造成数据库的压力过大
31 30 */
32 31 private static final Integer DELETE_LIMIT = 100;
33 32  
34 33 @Override
35 34 @TenantIgnore
36   - public String execute(String param) throws Exception {
37   - Integer integer = apiErrorLogService.jobCleanErrorLog(JOB_CLEAN_RETAIN_DAY,DELETE_LIMIT);
38   - log.info("定时执行清理错误日志数量({})个",integer);
39   - return String.format("定时执行清理错误日志数量 %s 个", integer);
  35 + public String execute(String param) {
  36 + Integer count = apiErrorLogService.cleanErrorLog(JOB_CLEAN_RETAIN_DAY,DELETE_LIMIT);
  37 + log.info("[count][定时执行清理错误日志数量 ({}) 个]", count);
  38 + return String.format("定时执行清理错误日志数量 %s 个", count);
40 39 }
41 40  
42 41 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/job/JobCleanRecordJob.java renamed to yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/job/logger/JobLogCleanJob.java
1   -package cn.iocoder.yudao.module.infra.job;
  1 +package cn.iocoder.yudao.module.infra.job.logger;
2 2  
3 3 import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
4 4 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
... ... @@ -8,13 +8,13 @@ import org.springframework.stereotype.Component;
8 8 import javax.annotation.Resource;
9 9  
10 10 /**
11   - * 定时 物理 删除任务日志的 Job
  11 + * 物理删除 N 天前的任务日志的 Job
12 12 *
13   - * @author: j-sentinel
  13 + * @author j-sentinel
14 14 */
15 15 @Slf4j
16 16 @Component
17   -public class JobCleanRecordJob implements JobHandler {
  17 +public class JobLogCleanJob implements JobHandler {
18 18  
19 19 @Resource
20 20 private JobLogService jobLogService;
... ... @@ -25,16 +25,16 @@ public class JobCleanRecordJob implements JobHandler {
25 25 private static final Integer JOB_CLEAN_RETAIN_DAY = 14;
26 26  
27 27 /**
28   - * 每次删除间隔的条数,如果值太高可能会造成数据库的宕机
  28 + * 每次删除间隔的条数,如果值太高可能会造成数据库的压力过大
29 29 */
30 30 private static final Integer DELETE_LIMIT = 100;
31 31  
32 32 @Override
33 33 @TenantIgnore
34   - public String execute(String param) throws Exception {
35   - Integer integer = jobLogService.timingJobCleanLog(JOB_CLEAN_RETAIN_DAY,DELETE_LIMIT);
36   - log.info("定时执行清理定时任务日志数量({})个",integer);
37   - return String.format("定时执行清理定时任务日志数量 %s 个", integer);
  34 + public String execute(String param) {
  35 + Integer count = jobLogService.cleanJobLog(JOB_CLEAN_RETAIN_DAY, DELETE_LIMIT);
  36 + log.info("[count][定时执行清理定时任务日志数量 ({}) 个]", count);
  37 + return String.format("定时执行清理定时任务日志数量 %s 个", count);
38 38 }
39 39  
40 40 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogService.java
... ... @@ -49,10 +49,11 @@ public interface JobLogService extends JobLogFrameworkService {
49 49 List<JobLogDO> getJobLogList(JobLogExportReqVO exportReqVO);
50 50  
51 51 /**
52   - * 清理 @param jobCleanRetainDay 天的访问日志
  52 + * 清理 exceedDay 天前的任务日志
53 53 *
54   - * @param jobLogExceedDay 超过多少天就进行清理
  54 + * @param exceedDay 超过多少天就进行清理
55 55 * @param deleteLimit 清理的间隔条数
56 56 */
57   - Integer timingJobCleanLog(Integer jobLogExceedDay,Integer deleteLimit);
  57 + Integer cleanJobLog(Integer exceedDay, Integer deleteLimit);
  58 +
58 59 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/job/JobLogServiceImpl.java
1 1 package cn.iocoder.yudao.module.infra.service.job;
2 2  
3   -import cn.hutool.core.date.DateUtil;
4 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
6 4 import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogExportReqVO;
7 5 import cn.iocoder.yudao.module.infra.controller.admin.job.vo.log.JobLogPageReqVO;
8 6 import cn.iocoder.yudao.module.infra.dal.dataobject.job.JobLogDO;
... ... @@ -16,7 +14,6 @@ import org.springframework.validation.annotation.Validated;
16 14 import javax.annotation.Resource;
17 15 import java.time.LocalDateTime;
18 16 import java.util.Collection;
19   -import java.util.Date;
20 17 import java.util.List;
21 18  
22 19 /**
... ... @@ -54,26 +51,19 @@ public class JobLogServiceImpl implements JobLogService {
54 51 }
55 52  
56 53 @Override
57   - public Integer timingJobCleanLog(Integer jobLogExceedDay,Integer deleteLimit) {
58   - Integer result;
  54 + @SuppressWarnings("DuplicatedCode")
  55 + public Integer cleanJobLog(Integer exceedDay, Integer deleteLimit) {
59 56 int count = 0;
60   - Date currentDate = DateUtil.date();
61   - // 计算过期日期:正数向未来偏移,负数向历史偏移
62   - Date expireDate = DateUtil.offsetDay(currentDate, -jobLogExceedDay);
  57 + LocalDateTime expireDate = LocalDateTime.now().minusDays(exceedDay);
  58 + // 循环删除,直到没有满足条件的数据
63 59 for (int i = 0; i < Short.MAX_VALUE; i++) {
64   - result = jobLogMapper.deleteByCreateTimeLt(expireDate,deleteLimit);
65   - count += result;
66   - if (result < deleteLimit) {
67   - // 达到删除预期条数
  60 + int deleteCount = jobLogMapper.deleteByCreateTimeLt(expireDate, deleteLimit);
  61 + count += deleteCount;
  62 + // 达到删除预期条数,说明到底了
  63 + if (deleteCount < deleteLimit) {
68 64 break;
69 65 }
70 66 }
71   - if(count > 0){
72   - // ALTER TABLE...FORCE 会导致表重建发生,这会根据主键索引对表空间中的物理页进行排序。
73   - // 它将行压缩到页面上并消除可用空间,同时确保数据处于主键查找的最佳顺序。
74   - // 优化表语句官方文档:https://dev.mysql.com/doc/refman/8.0/en/optimize-table.html
75   - jobLogMapper.optimizeTable();
76   - }
77 67 return count;
78 68 }
79 69  
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogService.java
... ... @@ -39,10 +39,11 @@ public interface ApiAccessLogService {
39 39 List<ApiAccessLogDO> getApiAccessLogList(ApiAccessLogExportReqVO exportReqVO);
40 40  
41 41 /**
42   - * 清理 @param accessLogJobDay 天的访问日志
  42 + * 清理 exceedDay 天前的访问日志
43 43 *
44   - * @param accessLogExceedDay 超过多少天就进行清理
  44 + * @param exceedDay 超过多少天就进行清理
45 45 * @param deleteLimit 清理的间隔条数
46 46 */
47   - Integer jobCleanAccessLog(Integer accessLogExceedDay,Integer deleteLimit);
  47 + Integer cleanAccessLog(Integer exceedDay, Integer deleteLimit);
  48 +
48 49 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiAccessLogServiceImpl.java
1 1 package cn.iocoder.yudao.module.infra.service.logger;
2 2  
3   -import cn.hutool.core.date.DateUtil;
4 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
6 4 import cn.iocoder.yudao.module.infra.api.logger.dto.ApiAccessLogCreateReqDTO;
7 5 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogExportReqVO;
8 6 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apiaccesslog.ApiAccessLogPageReqVO;
... ... @@ -14,7 +12,7 @@ import org.springframework.stereotype.Service;
14 12 import org.springframework.validation.annotation.Validated;
15 13  
16 14 import javax.annotation.Resource;
17   -import java.util.Date;
  15 +import java.time.LocalDateTime;
18 16 import java.util.List;
19 17  
20 18 /**
... ... @@ -47,26 +45,19 @@ public class ApiAccessLogServiceImpl implements ApiAccessLogService {
47 45 }
48 46  
49 47 @Override
50   - public Integer jobCleanAccessLog(Integer accessLogExceedDay,Integer deleteLimit) {
51   - Integer result;
  48 + @SuppressWarnings("DuplicatedCode")
  49 + public Integer cleanAccessLog(Integer exceedDay, Integer deleteLimit) {
52 50 int count = 0;
53   - Date currentDate = DateUtil.date();
54   - // 计算过期日期:正数向未来偏移,负数向历史偏移
55   - Date expireDate = DateUtil.offsetDay(currentDate, -accessLogExceedDay);
  51 + LocalDateTime expireDate = LocalDateTime.now().minusDays(exceedDay);
  52 + // 循环删除,直到没有满足条件的数据
56 53 for (int i = 0; i < Short.MAX_VALUE; i++) {
57   - result = apiAccessLogMapper.deleteByCreateTimeLt(expireDate,deleteLimit);
58   - count += result;
59   - if (result < deleteLimit) {
60   - // 达到删除预期条数
  54 + int deleteCount = apiAccessLogMapper.deleteByCreateTimeLt(expireDate, deleteLimit);
  55 + count += deleteCount;
  56 + // 达到删除预期条数,说明到底了
  57 + if (deleteCount < deleteLimit) {
61 58 break;
62 59 }
63 60 }
64   - if(count > 0){
65   - // ALTER TABLE...FORCE 会导致表重建发生,这会根据主键索引对表空间中的物理页进行排序。
66   - // 它将行压缩到页面上并消除可用空间,同时确保数据处于主键查找的最佳顺序。
67   - // 优化表语句官方文档:https://dev.mysql.com/doc/refman/8.0/en/optimize-table.html
68   - apiAccessLogMapper.optimizeTable();
69   - }
70 61 return count;
71 62 }
72 63  
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogService.java
... ... @@ -48,10 +48,11 @@ public interface ApiErrorLogService {
48 48 void updateApiErrorLogProcess(Long id, Integer processStatus, Long processUserId);
49 49  
50 50 /**
51   - * 清理 @param errorLogJobDay 天的访问日志
  51 + * 清理 exceedDay 天前的错误日志
52 52 *
53   - * @param errorLogExceedDay 超过多少天就进行清理
  53 + * @param exceedDay 超过多少天就进行清理
54 54 * @param deleteLimit 清理的间隔条数
55 55 */
56   - Integer jobCleanErrorLog(Integer errorLogExceedDay,Integer deleteLimit);
  56 + Integer cleanErrorLog(Integer exceedDay, Integer deleteLimit);
  57 +
57 58 }
... ...
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/logger/ApiErrorLogServiceImpl.java
1 1 package cn.iocoder.yudao.module.infra.service.logger;
2 2  
3   -import cn.hutool.core.date.DateUtil;
4 3 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5   -import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
6 4 import cn.iocoder.yudao.module.infra.api.logger.dto.ApiErrorLogCreateReqDTO;
7 5 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogExportReqVO;
8 6 import cn.iocoder.yudao.module.infra.controller.admin.logger.vo.apierrorlog.ApiErrorLogPageReqVO;
... ... @@ -16,7 +14,6 @@ import org.springframework.validation.annotation.Validated;
16 14  
17 15 import javax.annotation.Resource;
18 16 import java.time.LocalDateTime;
19   -import java.util.Date;
20 17 import java.util.List;
21 18  
22 19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
... ... @@ -68,26 +65,19 @@ public class ApiErrorLogServiceImpl implements ApiErrorLogService {
68 65 }
69 66  
70 67 @Override
71   - public Integer jobCleanErrorLog(Integer errorLogExceedDay,Integer deleteLimit) {
72   - Integer result;
  68 + @SuppressWarnings("DuplicatedCode")
  69 + public Integer cleanErrorLog(Integer exceedDay, Integer deleteLimit) {
73 70 int count = 0;
74   - Date currentDate = DateUtil.date();
75   - // 计算过期日期:正数向未来偏移,负数向历史偏移
76   - Date expireDate = DateUtil.offsetDay(currentDate, -errorLogExceedDay);
  71 + LocalDateTime expireDate = LocalDateTime.now().minusDays(exceedDay);
  72 + // 循环删除,直到没有满足条件的数据
77 73 for (int i = 0; i < Short.MAX_VALUE; i++) {
78   - result = apiErrorLogMapper.deleteByCreateTimeLt(expireDate,deleteLimit);
79   - count += result;
80   - if (result < deleteLimit) {
81   - // 达到删除预期条数
  74 + int deleteCount = apiErrorLogMapper.deleteByCreateTimeLt(expireDate, deleteLimit);
  75 + count += deleteCount;
  76 + // 达到删除预期条数,说明到底了
  77 + if (deleteCount < deleteLimit) {
82 78 break;
83 79 }
84 80 }
85   - if(count > 0){
86   - // ALTER TABLE...FORCE 会导致表重建发生,这会根据主键索引对表空间中的物理页进行排序。
87   - // 它将行压缩到页面上并消除可用空间,同时确保数据处于主键查找的最佳顺序。
88   - // 优化表语句官方文档:https://dev.mysql.com/doc/refman/8.0/en/optimize-table.html
89   - apiErrorLogMapper.optimizeTable();
90   - }
91 81 return count;
92 82 }
93 83  
... ...
yudao-server/src/main/resources/application-local.yaml
... ... @@ -9,7 +9,7 @@ spring:
9 9 exclude:
10 10 - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
11 11 - org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration # 排除积木报表带来的 MongoDB 的自动配置
12   - - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
  12 +# - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
13 13 - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
14 14 - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
15 15 - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
... ...