数据越积越多,过于冗余;数据库定期删除指定时间前的数据;文件生成的删除指定时间前端文件
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中保存3个月的数据,当超过3个月之后定时清除3个月之前的数据
-- 至少保留一个月数据量 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);
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);
}
}
<!-- 小于等于 -->
<delete id="deleteByTime">
delete from table_name where create_time <= DATE_SUB(NOW(), INTERVAL #{monthNum} MONTH)
</delete>