【问题标题】:Auto delete database rows after an expiration date过期日期后自动删除数据库行
【发布时间】:2016-08-24 12:08:27
【问题描述】:

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

提前致谢。

【问题讨论】:

    标签: java database spring hibernate postgresql


    【解决方案1】:

    此方法在 DAO 层检索超过 1 周的对象并将其删除:

     @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();
            }
        }
    

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

    【讨论】:

      【解决方案2】:

      Spring提供了对调度作业的支持。使用@scheduled注释可以实现这一点。你可以看看这个网站

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

      IE每分钟安排任务

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

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

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        由于您已经在使用 Spring,您可以使用 spring 调度程序运行必要的数据库查询以删除行。

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2017-01-09
            • 2014-08-25
            • 1970-01-01
            • 2021-09-30
            • 2012-02-02
            • 1970-01-01
            • 1970-01-01
            • 2021-09-21
            • 1970-01-01
            相关资源
            最近更新 更多