package scheduled_task;
|
import java.sql.*;
|
import java.time.LocalDate;
|
import java.time.format.DateTimeFormatter;
|
import java.util.ArrayList;
|
import java.util.List;
|
import java.util.concurrent.Executors;
|
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.TimeUnit;
|
import dell_targets.Dell_SystemConfiguration;
|
import databases.DBConnector; // Ìí¼Óµ¼Èë
|
|
public class TrackTableManager {
|
// ÒÆ³ýÓ²±àÂëµÄÊý¾Ý¿âÁ¬½Ó²ÎÊý
|
private static final int SAVE_DAYS = Dell_SystemConfiguration.TrajectoryRetentionDays;
|
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
|
private static final String TABLE_PREFIX = "tb_track_";
|
|
public static void Start() {
|
// ³õʼ»¯Ê±Á¢¼´Ö´ÐÐÒ»´Î
|
manageTables();
|
// ´´½¨¶¨Ê±ÈÎÎñ£¨Ã¿ÌìÁ賿1µãÖ´ÐУ©
|
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
scheduler.scheduleAtFixedRate(
|
TrackTableManager::manageTables,
|
getInitialDelay(),
|
24 * 60 * 60, // 24СʱÖÜÆÚ
|
TimeUnit.SECONDS
|
);
|
}
|
|
// Ö÷¹ÜÀíÂß¼
|
private static void manageTables() {
|
try {
|
// 1. ´´½¨Î´À´3ÌìµÄ±í
|
createFutureTables();
|
|
// 2. ɾ³ý¹ýÆÚ±í
|
deleteExpiredTables();
|
|
} catch (SQLException e) {
|
System.err.println("Êý¾Ý¿â²Ù×÷ʧ°Ü: " + e.getMessage());
|
}
|
}
|
|
// ´´½¨Î´À´3ÌìµÄ±í£¨°üÀ¨Ã÷Ìì¡¢ºóÌìºÍ´óºóÌ죩
|
private static void createFutureTables() throws SQLException {
|
for (int i = 1; i <= 3; i++) {
|
String futureDate = LocalDate.now().plusDays(i).format(DATE_FORMATTER);
|
String tableName = TABLE_PREFIX + futureDate;
|
if (!tableExists(tableName)) {
|
DBConnector.executeUpdate(getcreateSQL(tableName));
|
}
|
}
|
}
|
|
// ɾ³ý¹ýÆÚ±í
|
private static void deleteExpiredTables() throws SQLException {
|
LocalDate thresholdDate = LocalDate.now().minusDays(SAVE_DAYS);
|
String threshold = thresholdDate.format(DATE_FORMATTER);
|
|
for (String table : getAllTrackTables()) {
|
String datePart = table.substring(TABLE_PREFIX.length());
|
if (datePart.compareTo(threshold) < 0) {
|
DBConnector.executeUpdate("DROP TABLE " + table);
|
}
|
}
|
}
|
|
public static String getcreateSQL(String tableName) {
|
String createSQL = "CREATE TABLE " + tableName + " (" +
|
"id INT(30) PRIMARY KEY AUTO_INCREMENT COMMENT 'ÐòºÅ'," +
|
"device_number VARCHAR(30) NOT NULL COMMENT 'É豸±àºÅ'," +
|
"device_name VARCHAR(30) COMMENT 'É豸Ãû³Æ'," +
|
"x_coordinate VARCHAR(30) COMMENT 'X×ø±ê'," +
|
"y_coordinate VARCHAR(30) COMMENT 'Y×ø±ê'," +
|
"z_coordinate VARCHAR(30) COMMENT 'Z×ø±ê'," +
|
"layer VARCHAR(30) COMMENT 'ËùÔÚ²ã'," +
|
"battery VARCHAR(30) COMMENT 'µçÁ¿'," +
|
"utc_times VARCHAR(30) COMMENT 'UTCʱ¼ä'," +
|
"latitude VARCHAR(30) COMMENT 'γ¶È'," +
|
"longitude VARCHAR(30) COMMENT '¾¶È'," +
|
"positioning_quality VARCHAR(30) COMMENT '¶¨Î»ÖÊÁ¿'," +
|
"satellite_count VARCHAR(30) COMMENT 'ÎÀÐÇÊýÁ¿'," +
|
"hdop VARCHAR(30) COMMENT 'ˮƽ¾«¶ÈÒò×Ó'," +
|
"altitude VARCHAR(30) COMMENT 'º£°Î¸ß¶È'," +
|
"geoid_height VARCHAR(30) COMMENT '´óµØË®×¼Ãæ¸ß¶È'," +
|
"differential_time VARCHAR(30) COMMENT '²î·Öʱ¼ä'," +
|
"source VARCHAR(30) COMMENT '¶¨Î»½á¹ûÀ´Ô´(0=UWB,1=ÎÀÐÇ,3=À¶ÑÀ)'," +
|
"company VARCHAR(30) COMMENT 'ËùÊô¹«Ë¾'," +
|
"save_time VARCHAR(30) COMMENT '±£´æÊ±¼ä'" +
|
") ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='¹ì¼£¼Ç¼±í'";
|
return createSQL;
|
}
|
|
// ¼ì²é±íÊÇ·ñ´æÔÚ
|
private static boolean tableExists(String tableName) throws SQLException {
|
try (ResultSet rs = DBConnector.executeQuery(
|
"SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = ?",
|
tableName)) {
|
return rs.next() && rs.getInt(1) > 0;
|
}
|
}
|
|
// »ñÈ¡ËùÓй켣±í
|
private static List<String> getAllTrackTables() throws SQLException {
|
List<String> tables = new ArrayList<>();
|
try (ResultSet rs = DBConnector.executeQuery(
|
"SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name LIKE ?",
|
TABLE_PREFIX + "%")) {
|
while (rs.next()) {
|
tables.add(rs.getString("table_name"));
|
}
|
}
|
return tables;
|
}
|
|
// ¼ÆËãÊ×´ÎÖ´ÐÐÑÓ³Ù£¨µ½ÏÂÒ»¸öÁ賿1µãµÄÃëÊý£©
|
private static long getInitialDelay() {
|
long now = System.currentTimeMillis() / 1000;
|
long oneDay = 24 * 60 * 60;
|
long target = (now / oneDay * oneDay) + oneDay + 3600; // ÏÂÒ»ÌìÁ賿1µã
|
return target - now;
|
}
|
}
|