Удалить строку из MySQL через 24 часа в JEE? - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь удалить строку в моей таблице. Вот мой пример кода

String DBDate = new String();
Long date = new Date().getTime();           
String dateToday = date.toString();             
dbobj.clear();
dbobj.put(LAST_TIME_ANSWERED, "");
int hasDB = dbobj.getFromDB(tableName,column key, primary key);

if(hasDB != 0) {
    DBDate = dbobj.get(LAST_TIME_ANSWERED);
    if(DBDate != dateToday) {
        dbobj.deleteClientDB(tableName, column key, primary key);
    }
}

Как я могу изменить дату таймера? Любая помощь будет хорошей. Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 19 февраля 2020

есть два варианта для этого. 1.) использовать java планировщик или 2.) использовать запланированное задание на уровне БД для очистки данных в конце каждого дня

0 голосов
/ 19 февраля 2020

Обычной практикой является удаление записей базы данных, которые старше некоторого порогового значения. Для этого в таблице базы данных должен быть столбец с отметкой времени, представляющей время вставки или обновления. При выполнении запланированной задачи там выполняется команда (псевдокод, при условии отметки времени «обновления»):

УДАЛИТЬ ИЗ TABLE_NAME, ГДЕ LAST_UPDATED <(CURRENT_TIME - THRESHOLD) </p>

Или существует запрос выбора выполняется для извлечения всех этих записей и обработки их удаления по одному, включая ведение журнала и, возможно, некоторые условные логи c.

Для достижения этой функциональности java SE предоставляет ScheduledExecutorService , которые можно использовать для выполнения отложенных задач:

    // initialize scheduler
    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    // schedule repeating task
    ScheduledFuture future = scheduler.scheduleAtFixedRate(
            () -> {
                System.out.println("Excuting task...");
            },
            60,
            60,
            TimeUnit.SECONDS
    );

Будущий объект можно использовать для отмены задачи:

future.cancel(true);
scheduler.shutdown();

Но при использовании корпоративных решений обычно есть библиотеки и интегрированные среды, обеспечивающие функциональность для выполнения запланированные задачи: Кварцевый планировщик , Планирование задач Spring Framework или Службы таймера EJB .

0 голосов
/ 19 февраля 2020

Это неудобно в java, потому что вам нужно выполнить задание по расписанию, чтобы достичь этого. Вы должны строго рассмотреть использование планировщика событий mysql. См. этот ответ для примера этого.

Когда вы вставляете строку в БД, вы должны настроить событие, которое будет инициировано ровно один раз, 24 часа спустя, с необходимым sql чтобы удалить строку. В результате вы получите одно событие в строке.

В качестве альтернативы, с java и правильно настроенным сервером, после каждой вставки строки вы можете добавить задание cron или кварца, которое будет запускаться один раз, 24 часа спустя, это вызвало бы функцию java для удаления строки. Это сложнее, чем использовать встроенный в DB планировщик событий.

В зависимости от версии JEE (> 6) вы можете использовать таймер EJB 3.1, как подробно описано в в этом сообщении .

Из этих опций, вероятно, лучше всего подходит планировщик событий db, потому что другие могут go ошибаться, если сервер JEE не работает.

...