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; public class TrackTableManager { // ÅäÖòÎÊý private static final String JDBC_URL = "jdbc:mysql://localhost:3306/your_database?useSSL=false"; private static final String USERNAME = "your_username"; private static final String PASSWORD = "your_password"; private static final int SAVE_DAYS = 30; // ¹ì¼£Êý¾Ý±£´æÌìÊý private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); private static final String TABLE_PREFIX = "tb_track_"; public static void main(String[] args) { // ³õʼ»¯Ê±Á¢¼´Ö´ÐÐÒ»´Î manageTables(); // ´´½¨¶¨Ê±ÈÎÎñ£¨Ã¿ÌìÁ賿1µãÖ´ÐУ© ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate( TrackTableManager::manageTables, getInitialDelay(), 24 * 60 * 60, // 24СʱÖÜÆÚ TimeUnit.SECONDS ); } // Ö÷¹ÜÀíÂß¼­ private static void manageTables() { try (Connection conn = DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD)) { // 1. ´´½¨Ã÷ÌìµÄ±í createTomorrowTable(conn); // 2. ɾ³ý¹ýÆÚ±í deleteExpiredTables(conn); } catch (SQLException e) { System.err.println("Êý¾Ý¿â²Ù×÷ʧ°Ü: " + e.getMessage()); } } // ´´½¨Ã÷ÌìµÄ±í private static void createTomorrowTable(Connection conn) throws SQLException { String tomorrow = LocalDate.now().plusDays(1).format(DATE_FORMATTER); String tableName = TABLE_PREFIX + tomorrow; if (!tableExists(conn, 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='¹ì¼£¼Ç¼±í'"; try (Statement stmt = conn.createStatement()) { stmt.executeUpdate(createSQL); System.out.println("±í´´½¨³É¹¦: " + tableName); } } else { System.out.println("±íÒÑ´æÔÚ: " + tableName); } } // ɾ³ý¹ýÆÚ±í private static void deleteExpiredTables(Connection conn) throws SQLException { LocalDate thresholdDate = LocalDate.now().minusDays(SAVE_DAYS); String threshold = thresholdDate.format(DATE_FORMATTER); for (String table : getAllTrackTables(conn)) { String datePart = table.substring(TABLE_PREFIX.length()); if (datePart.compareTo(threshold) < 0) { try (Statement stmt = conn.createStatement()) { stmt.executeUpdate("DROP TABLE " + table); System.out.println("ÒÑɾ³ý¹ýÆÚ±í: " + table); } } } } // ¼ì²é±íÊÇ·ñ´æÔÚ private static boolean tableExists(Connection conn, String tableName) throws SQLException { try (ResultSet rs = conn.getMetaData().getTables(null, null, tableName, null)) { return rs.next(); } } // »ñÈ¡ËùÓй켣±í private static List getAllTrackTables(Connection conn) throws SQLException { List tables = new ArrayList<>(); try (ResultSet rs = conn.getMetaData().getTables(null, null, TABLE_PREFIX + "%", null)) { 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; } }