Обновление записи базы данных каждый месяц - PullRequest
2 голосов
/ 19 июля 2011

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

Один раз в день ...

  • Найти всех пользователей, которые были обновлены месяц назад (или более, в случае сбоя процесса длядень)
  • Обновить их
  • Увеличить день их последнего обновления на месяц

Звучит просто, но проще, чем есть.Проблема в том, что месяцы не всегда имеют одинаковое количество дней.Например, если кто-то подписывается 31 марта, когда он должен быть обновлен?30 апреля, 1 мая?Или я должен просто ограничить диапазон дней обновления самым низким общим диапазоном, 28?Конечно, я мог бы просто сделать это 1-го числа для всех, хотя это и не так идеально.

Есть ли у вас опыт, которым можно поделиться с подобными ситуациями?Я использую MySQL 5 из Java + JPA + Hibernate.Если это поможет, я уже использую JodaTime для чего-то другого.

Ответы [ 5 ]

1 голос
/ 19 июля 2011

При использовании пружины Планирование пружины - это то, на что вы можете взглянуть. У вас может быть такой метод:

@Scheduled("0 0 1 * *") // cron expression
public void executeOnceAMonth() {
}

и просто наберите <task:annotation-driven /> (подробнее о конфигурации - в связанном документе)

На самом деле это абстракция над Кварц , поэтому вы также можете использовать для этого задание Кварц.

0 голосов
/ 19 июля 2011

Я не понимаю, почему делать это в первый месяц не так идеально.Особенно, если вы даете частичную оценку, чтобы привести каждого пользователя к одной и той же дате

Самый простой способ справиться с этим по моему опыту - это "нормализовать" каждого пользователя до первого числа месяца, когда они присоединяются.Поэтому, если кто-то присоединится 15 июня, он получит кредит

1- (15/30) x month_credits.

С этого момента наступает 1-е число месяца.

Примечание: вы можете использовать аналогичный метод для назначения пользователей на разные дни (1-28), если вы хотите распределить их поконкретная причина.

0 голосов
/ 19 июля 2011

Получите максимальный день месяца по следующему коду.

    Calendar calendar = Calendar.getInstance();     
    java.sql.Date userSignupdate = ...;
    calendar.setTimeInMillis( userSignupdate );

    // maxDay will hold the maximum date of the month. {28,29,30,31}
    int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
0 голосов
/ 19 июля 2011

Вместо этого есть столбец 'next_update_time', поэтому, когда пользователь регистрируется, значение столбца должно обновляться со временем после месяца

Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
cal.getTime();

запускать cronjob (вызывать другой небольшой код Java) каждые несколько часов, чтобы проверять наличие столбцов, у которых next_update_time> = текущее время, если да, обновлять записи и устанавливать значение next_update_time на следующий месяц.

0 голосов
/ 19 июля 2011

Можете ли вы просто запустить запланированное задание 20 числа каждого месяца (или что-то еще) и рассчитать кредиты для каждого пользователя на данный момент?

Я бы не усложнял ситуацию со смещениями и прочим, если в этом нет особой необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...