在到期日期后自动删除数据库行

时间:2016-04-29 10:54:56

标签: java database spring hibernate postgresql

我正在使用基于Spring,Hibernate和Postgresql的网站上分类广告。这些分类广告的发布期为2周至6个月。 如何实施自动删除过期分类广告的解决方案? 最好从java层删除它们还是使用Postgresql调度程序?

提前致谢。

4 个答案:

答案 0 :(得分: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
    }

我更喜欢在Spring中(在Web应用程序中)使用它,因为如果我迁移数据库或操作系统,那么我必须重写它。

希望有所帮助

答案 1 :(得分:0)

这是一个UNIX解决方案吗?如果是这样,请使用CRON调用PostgreSQL .sql脚本,该脚本会在您认为必要的持续时间内删除它们。

答案 2 :(得分:0)

由于您已经在使用Spring,因此可以使用spring scheduler运行必要的数据库查询来删除行。

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

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

答案 3 :(得分: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();
        }
    }

它每晚运行,当然你可以改变它。