【java】保留前N月数据文件,定期删除数据

发布时间:2023年12月18日

数据越积越多,过于冗余;数据库定期删除指定时间前的数据;文件生成的删除指定时间前端文件

SFTP文件定期删除

java sftp 定时清理指定文件中固定时间

  • 依赖
<!-- ftp文件上传/下载Jar包 -->
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.54</version>
</dependency>
  • 代码

import com.jcraft.jsch.*;

import java.util.Vector;

/**
 * java sftp 定时清理指定文件中固定时间
 */
public class SftpCleanup {
    public static void main(String[] args) throws JSchException {
        String host = "127.0.0.1"; // SFTP主机地址
        int port = 22; // SFTP端口号
        String username = "xxx"; // SFTP登录用户名
        String password = "xxxx"; // SFTP登录密码

        Session session = null;
        ChannelSftp channelSftp = null;

        try {
            JSch jsch = new JSch();

            // 创建Session对象
            session = jsch.getSession(username, host, port);
            session.setPassword(password);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();

            // 打开ChannelSftp通道
            channelSftp = (ChannelSftp) session.openChannel("sftp");
            channelSftp.connect();

            // 设置删除目标文件的路径及过期时间(单位为分钟)
            // 默认为当前日期之前的24小时内的文件将被删除
            //long expireTimeInMinutes = 60 * 24;
            long currentTimeMillis = System.currentTimeMillis();
            //long threeMonthsAgoInMillis = currentTimeMillis - 2 * 7 * 60 * 60 * 1000L; // 当前时间减去N个天的毫秒数
            long threeMonthsAgoInMillis = currentTimeMillis - 90 * 24 * 60 * 60 * 1000L; // 当前时间减去3个月(3*30)的毫秒数
            String targetPath = "/data/file/hi/"; // 目标文件路径
            Vector<ChannelSftp.LsEntry> fileList = channelSftp.ls(targetPath); // 要清理的目标文件所在路径
            for (ChannelSftp.LsEntry entry : fileList) {
                if (!entry.getAttrs().isDir()) {
                    long fileCreationTime = entry.getAttrs().getMTime() * 1000L;
                    printTimeDifference(true, fileCreationTime, threeMonthsAgoInMillis);
                    if (fileCreationTime < threeMonthsAgoInMillis) {
                        channelSftp.rm(targetPath + entry.getFilename()); // 删除符合条件的文件
                        System.out.println("成功删除文件:" + targetPath + entry.getFilename());
                    } else {
                        System.out.println("未到达过期时间,不处理文件:" + targetPath + entry.getFilename());
                    }
                }
            }
        } catch (JSchException | SftpException e) {
            e.printStackTrace();
        } finally {
            // 关闭ChannelSftp通道和会话
            if (channelSftp != null && channelSftp.isConnected()) {
                channelSftp.disconnect();
            }
            if (session != null && session.isConnected()) {
                session.disconnect();
            }
        }
    }

    /**
     * 打印计算时间差
     *
     * @param fileCreationTime  sftpFileTime
     * @param presetsTimeMillis threeMonthsAgoInMillis
     */
    private static void printTimeDifference(boolean debugger, long fileCreationTime, long presetsTimeMillis) {
        // 计算两者之间的差值(单位:微秒)
        long diffMicroseconds = (fileCreationTime - presetsTimeMillis);
        // 将差值转化为小时、分钟和秒
        int days = (int) (diffMicroseconds / (24 * 60 * 60 * 1000));
        int hours = (int) (diffMicroseconds / (60 * 60 * 1000));
        int minutes = (int) ((diffMicroseconds % (60 * 60 * 1000)) / (60 * 1000));
        int seconds = (int) ((diffMicroseconds % (60 * 1000)) / 1000);
        // 输出结果
        //System.out.println("差值为 " + diffMicroseconds + " 微秒");
        if (debugger) {
            System.out.println("差值为 " + days + " 天 " + hours + " 小时 " + minutes + " 分钟 " + seconds + " 秒");
        }
    }
}

mysql保存N个月的数据

mysql中保存3个月的数据,当超过3个月之后定时清除3个月之前的数据

  • Mysql
-- 至少保留一个月数据量 delete from table_name
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
select count(*) from table_name where create_time < DATE_SUB(NOW(), INTERVAL 1 MONTH);
  • Api
    public void deleteCustomerTouch(String monthNum) {
        if (StringUtils.isBlank(monthNum)) {
            monthNum = YsConst.Month.THREE;
        }
        //值不为空,且值为数值,且值要大于等于1
        if (NumberUtil.isNumber(monthNum) && NumberUtil.parseInt(monthNum) >= 1) {
            apiService.deleteByTime(monthNum);
        } else {
            logger.error("【apiService】其他的,参数错误 monthNum={}", monthNum);
        }
    }
  • Mapper
    <!-- 小于等于 -->
    <delete id="deleteByTime">
        delete from table_name where create_time &lt;= DATE_SUB(NOW(), INTERVAL #{monthNum} MONTH)
    </delete>
文章来源:https://blog.csdn.net/u010638673/article/details/134978011
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。