每月更新一次数据库记录

时间:2011-07-19 08:57:32

标签: java mysql date calendar

我需要每个月更新一下我的数据库中的一些用户记录(具体来说,给他们属于他们的订阅的积分),从他们注册的那天开始。我想这样做:

每天一次......

  • 查找一个月前已更新的所有用户(或更多,以防过程失败 天)
  • 更新它们
  • 将他们的最后更新日期延长一个月

听起来很简单,但比它简单。问题是几个月并不总是有相同的天数。例如,如果有人注册3月31日,他应该何时更新? 4月30日,5月1日?或者我应该简单地将更新天数的范围限制在最低的常见范围28?我当然可以在第一天为大家做,虽然那不太理想。

你有经验与这样的情况分享?我正在使用Java + JPA + Hibernate中的MySQL 5。如果它有帮助,我已经在使用JodaTime了。

5 个答案:

答案 0 :(得分:1)

如果使用弹簧,Spring scheduling就是你可以看到的。你可以有这样的方法:

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

并且只有<task:annotation-driven />(有关配置的更多详细信息 - 在链接文档中)

这实际上是对Quartz的抽象,因此您也可以使用Quartz作业来完成它。

答案 1 :(得分:0)

您是否可以在每月20日(或其他任何时间)运行预定作业并计算每个用户的学分?

如果不是非常必要的话,我不会用偏移和东西使情况复杂化。

答案 2 :(得分:0)

而是有一个列'next_update_time',所以当用户注册时,列值应该用一个月后的时间更新

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

每隔几个小时运行一个cronjob(调用另一个小的java代码)来检查具有next_update_time&gt; =当前时间的列,如果是,则更新记录并将next_update_time值设置为下个月。

答案 3 :(得分:0)

按照以下代码获取当月的最大日期。

    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);

答案 4 :(得分:0)

我不明白为什么在这个月的第一天这样做不太理想。特别是如果你给予每个用户同一日期的部分功劳

根据我的经验,处理此问题的最简单方法是将每个用户“规范化”到他们加入时的第一个月。因此,如果有人在6月15日加入,他们会得到一个

1-(15/30)x monthly_credits credit。

从那时起,这是本月的第一天。

注意,如果您希望将用户分散到特定原因,可以使用类似的方法将用户分配到不同的日期(1-28)。