2016-04-29 27 views
2

我正在基于Spring,Hibernate和Postgresql的分类广告网站上工作。这些分类广告的刊登时间从2周到6个月不等。 如何实施自动删除过期分类广告的解决方案? 最好从java层删除它们或使用Postgresql调度程序?在有效日期后自动删除数据库行

在此先感谢。

回答

0

这是UNIX解决方案吗?如果是这样,请使用CRON调用PostgreSQL .sql脚本,该脚本会根据您需要的持续时间将其删除。

0

因为您已经在使用Spring,您可以使用spring scheduler运行必要的DB查询来删除行。

<task:scheduled-tasks> 
    <task:scheduled ref="deleteJob" method="run" cron="0 * * * * *"/> 
</task:scheduled-tasks> 
<bean id="deleteJob" class="..."/> 

deleteJob是一个简单的Spring bean,其run()方法将基于CRON执行。

1

Spring为调度作业提供支持。这可以使用@Scheduled注释。你可以看看这个网站

http://howtodoinjava.com/spring/spring-core/4-ways-to-schedule-tasks-in-spring-3-scheduled-example/

即每分钟安排任务

@Override 
    @Scheduled(cron = "1 * * * * ?") 
    public final void updateTest() throws IOException { 
     //do something here 
    } 

我宁愿它在春季(在Web应用程序),因为如果我迁移数据库或操作系统,那么我必须重写它。

希望它可以帮助

0

此方法检索对象超过1周和删除它们,在DAO层:

@Override 
    @Scheduled(cron = "0 4 4 * * ?") 
    public void deleteChatMessagesAutomatically() { 
     if(schedulerActive.equals("true")) { 
      Session session = this.sessionFactory.getCurrentSession(); 
      long now = System.currentTimeMillis(); 
      long nowMinus1Week = now - (1000 * 60 * 60 * 24 * 7); 
      Timestamp nowMinus1WeekAsTimeStamp = new Timestamp(nowMinus1Week); 
      Query query = session.createQuery("from ChatMessages as cm where cm.sortTimeStamp <:limit"); 
      query.setParameter("limit", nowMinus1WeekAsTimeStamp); 
      List<ChatMessages> chatMessagesList = query.list(); 
      chatMessagesList.forEach(session::delete); 
      session.flush(); 
     } 
    } 

它,每天晚上运行着,当然你可以改变这种状况。